/*
(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)
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;
}