Allows IRQs to be disabled while proc_destroy()ing
[akaros.git] / kern / src / radix.c
index ccd2020..9434dc3 100644 (file)
@@ -43,10 +43,12 @@ void radix_tree_destroy(struct radix_tree *tree)
 }
 
 /* Attempts to insert an item in the tree at the given key.  ENOMEM if we ran
- * out of memory, EEXIST if an item is already in the tree. */
-int radix_insert(struct radix_tree *tree, unsigned long key, void *item)
+ * out of memory, EEXIST if an item is already in the tree.  On success, will
+ * also return the slot pointer, if requested. */
+int radix_insert(struct radix_tree *tree, unsigned long key, void *item,
+                 void ***slot_p)
 {
-       printd("RADIX: insert %08p at %d\n", item, key);
+       printd("RADIX: insert %p at %d\n", item, key);
        struct radix_node *r_node;
        void **slot;
        /* Is the tree tall enough?  if not, it needs to grow a level.  This will
@@ -82,6 +84,8 @@ int radix_insert(struct radix_tree *tree, unsigned long key, void *item)
                return -EEXIST;
        *slot = item;
        r_node->num_items++;
+       if (slot_p)
+               *slot_p = slot;
        return 0;
 }
 
@@ -251,7 +255,7 @@ int radix_tag_gang_lookup(struct radix_tree *tree, void **results,
 
 void print_radix_tree(struct radix_tree *tree)
 {
-       printk("Tree %08p, Depth: %d, Bound: %d\n", tree, tree->depth,
+       printk("Tree %p, Depth: %d, Bound: %d\n", tree, tree->depth,
               tree->upper_bound);
 
        void print_rnode(struct radix_node *r_node, int depth)
@@ -261,14 +265,14 @@ void print_radix_tree(struct radix_tree *tree)
                char buf[32] = {0};
                for (int i = 0; i < depth; i++)
                        buf[i] = '\t';
-               printk("%sRnode %08p, parent %08p, myslot %08p, %d items, leaf? %d\n",
+               printk("%sRnode %p, parent %p, myslot %p, %d items, leaf? %d\n",
                       buf, r_node, r_node->parent, r_node->my_slot, r_node->num_items,
                       r_node->leaf);
                for (int i = 0; i < NR_RNODE_SLOTS; i++) {
                        if (!r_node->items[i])
                                continue;
                        if (r_node->leaf)
-                               printk("\t%sRnode Item %d: %08p\n", buf, i, r_node->items[i]);
+                               printk("\t%sRnode Item %d: %p\n", buf, i, r_node->items[i]);
                        else
                                print_rnode(r_node->items[i], depth + 1);
                }