X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/d8d001a6664b88b66524989589fcd809de6d3a92..ab281459f86543c6b8c11ecccc3e743c3d69577e:/lunaix-os/kernel/ds/btrie.c diff --git a/lunaix-os/kernel/ds/btrie.c b/lunaix-os/kernel/ds/btrie.c index 92f034b..8a4380e 100644 --- a/lunaix-os/kernel/ds/btrie.c +++ b/lunaix-os/kernel/ds/btrie.c @@ -25,7 +25,7 @@ __btrie_traversal(struct btrie* root, uint32_t index, int options) struct btrie_node* tree = root->btrie_root; // Time complexity: O(log_2(log_2(N))) where N is the index to lookup - while (lz && tree) { + while (bitmask && tree) { i = (index & bitmask) >> lz; struct btrie_node *subtree = 0, *pos, *n; @@ -61,6 +61,7 @@ btrie_init(struct btrie* btrie, uint32_t trunc_bits) { btrie->btrie_root = vzalloc(sizeof(struct btrie_node)); llist_init_head(&btrie->btrie_root->nodes); + llist_init_head(&btrie->btrie_root->children); btrie->truncated = trunc_bits; } @@ -82,15 +83,16 @@ btrie_set(struct btrie* root, uint32_t index, void* data) } void -__btrie_remove(struct btrie_node* node) +__btrie_rm_recursive(struct btrie_node* node) { struct btrie_node* parent = node->parent; + if (parent) { llist_delete(&node->siblings); llist_delete(&node->nodes); vfree(node); - if (llist_empty(&parent->children)) { - __btrie_remove(parent); + if (llist_empty(&parent->children) && !parent->data) { + __btrie_rm_recursive(parent); } } } @@ -103,7 +105,11 @@ btrie_remove(struct btrie* root, uint32_t index) return 0; } void* data = node->data; - __btrie_remove(node); + if (!llist_empty(&node->children)) { + node->data = NULL; + } else { + __btrie_rm_recursive(node); + } return data; }