]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - buffer_tree.c
btr support for para_client.
[paraslash.git] / buffer_tree.c
index 7180149ee49ade68b6310bb2f596562cb8ff08a8..1ea68917cd5438cffc4d64a5d3292d43fcd7da3a 100644 (file)
@@ -171,9 +171,9 @@ static void btr_pool_deallocate(struct btr_pool *btrp, size_t size)
 /*
        (parent, child):
        (NULL, NULL): new, isolated node.
-       (NULL, c): new node becomes root, c must be old root
        (p, NULL): new leaf node
-       (p, c): new internal node, ch must be child of p
+       (NULL, c): new node becomes root, c must be old root
+       (p, c): new internal node, ch must be child of p, not yet implemented
 
 */
 struct btr_node *btr_new_node(struct btr_node_description *bnd)
@@ -186,14 +186,31 @@ struct btr_node *btr_new_node(struct btr_node_description *bnd)
        btrn->context = bnd->context;
        btrn->start.tv_sec = 0;
        btrn->start.tv_usec = 0;
-       if (bnd->parent)
-               list_add_tail(&btrn->node, &bnd->parent->children);
        INIT_LIST_HEAD(&btrn->children);
        INIT_LIST_HEAD(&btrn->input_queue);
-       if (bnd->parent)
-               PARA_INFO_LOG("added %s as child of %s\n", bnd->name, bnd->parent->name);
-       else
-               PARA_INFO_LOG("added %s as btr root\n", bnd->name);
+       if (!bnd->child) {
+               if (bnd->parent) {
+                       list_add_tail(&btrn->node, &bnd->parent->children);
+                       PARA_INFO_LOG("new leaf node: %s (child of %s)\n",
+                               bnd->name, bnd->parent->name);
+               } else
+                       PARA_INFO_LOG("added %s as btr root\n", bnd->name);
+               goto out;
+       }
+       if (!bnd->parent) {
+               assert(!bnd->child->parent);
+               PARA_INFO_LOG("new root: %s (was %s)\n",
+                       bnd->name, bnd->child->name);
+               btrn->parent = NULL;
+               list_add_tail(&bnd->child->node, &btrn->children);
+               /* link it in */
+               bnd->child->parent = btrn;
+               goto out;
+       }
+       PARA_EMERG_LOG("inserting internal nodes not yet supported.\n");
+       exit(EXIT_FAILURE);
+       assert(bnd->child->parent == bnd->parent);
+out:
        return btrn;
 }