fix: use wait queue for blocking process
[lunaix-os.git] / lunaix-os / kernel / ds / btrie.c
index 92f034bebce60979324d3bf992da019c16e090b4..8a4380e4c19da2320979f8462a71c5ee367c9b1b 100644 (file)
@@ -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;
 }