/*
- * Copyright (C) 2009-2012 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2009-2013 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
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);
+ list_add_tail(&btrn->node, &bnd->parent->children);
+ list_move(&bnd->child->node, &btrn->children);
+ bnd->child->parent = btrn;
+ PARA_INFO_LOG("added %s as internal node\n", bnd->name);
out:
return btrn;
}
{
struct btr_buffer *btrb;
- assert(size != 0);
+ if (size == 0)
+ return;
if (list_empty(&btrn->children)) {
free(buf);
return;
{
struct btr_buffer *btrb;
- assert(size != 0);
+ if (size == 0)
+ return;
if (list_empty(&btrn->children))
return;
btrb = new_btrb((char *)buf, size);
char *buf;
size_t avail;
- assert(size != 0);
+ if (size == 0)
+ return;
if (list_empty(&btrn->children))
return;
avail = btr_pool_get_buffer(btrp, &buf);
}
/**
- * Find out whether a node is an orphan node.
+ * Find out whether a node is an orphan.
*
* \param btrn The buffer tree node.
*
* \return True if \a btrn has no parent.
*
- * This function will always return true for the root node. However in case
- * nodes have been removed from the tree, other nodes may become orphans too.
+ * This function returns true for the root node and false for any other node.
+ *
+ * After a (non-leaf) node was removed removed from the tree, the function
+ * returns true for all child nodes.
*/
bool btr_no_parent(struct btr_node *btrn)
{
ch->parent = btrn->parent;
if (btrn->parent)
list_move(&ch->node, &btrn->parent->children);
+ else
+ list_del(&ch->node);
}
assert(list_empty(&btrn->children));
btrn->parent = NULL;
{
*tv = btrn->start;
}
+
+/**
+ * Get the parent node of a buffer tree node.
+ *
+ * \param btrn The node whose parent should be returned.
+ *
+ * \a btrn must not be \p NULL.
+ *
+ * \return The parent of \a btrn, or \p NULL if \a btrn is the
+ * root node of the buffer tree.
+ */
+struct btr_node *btr_parent(struct btr_node *btrn)
+{
+ return btrn->parent;
+}