X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=buffer_tree.c;h=4160646da483bff8c8b0eea6c754d05fe17cf895;hp=40079c2ff9984f5207ad5f1cb0aeaaf78bf9dedc;hb=b21e8ef1df178fed144619bd3fba8cb67148454f;hpb=8fa697a6fc4430625cfd66fdce6e36bd8aec739b diff --git a/buffer_tree.c b/buffer_tree.c index 40079c2f..4160646d 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -100,6 +100,10 @@ size_t btr_pool_unused(struct btr_pool *btrp) return btr_pool_size(btrp) - btr_pool_filled(btrp); } +/* + * Return maximal size available for one read. This is + * smaller than the value returned by btr_pool_unused(). + */ size_t btr_pool_available(struct btr_pool *btrp) { if (!btrp->whead) @@ -168,25 +172,32 @@ static void btr_pool_deallocate(struct btr_pool *btrp, size_t size) #define FOR_EACH_BUFFER_REF_SAFE(_br, _tmp, _btrn) \ list_for_each_entry_safe((_br), (_tmp), &(_btrn)->input_queue, node) -struct btr_node *btr_new_node(const char *name, struct btr_node *parent, - btr_command_handler handler, void *context) +/* + (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 + +*/ +struct btr_node *btr_new_node(struct btr_node_description *bnd) { struct btr_node *btrn = para_malloc(sizeof(*btrn)); - btrn->name = para_strdup(name); - btrn->parent = parent; - btrn->execute = handler; - btrn->context = context; + btrn->name = para_strdup(bnd->name); + btrn->parent = bnd->parent; + btrn->execute = bnd->handler; + btrn->context = bnd->context; btrn->start.tv_sec = 0; btrn->start.tv_usec = 0; - if (parent) - list_add_tail(&btrn->node, &parent->children); + if (bnd->parent) + list_add_tail(&btrn->node, &bnd->parent->children); INIT_LIST_HEAD(&btrn->children); INIT_LIST_HEAD(&btrn->input_queue); - if (parent) - PARA_INFO_LOG("added %s as child of %s\n", name, parent->name); + 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", name); + PARA_INFO_LOG("added %s as btr root\n", bnd->name); return btrn; } @@ -484,12 +495,17 @@ void btr_remove_node(struct btr_node *btrn) size_t btr_get_input_queue_size(struct btr_node *btrn) { struct btr_buffer_reference *br; - size_t size = 0; + size_t size = 0, wrap_consumed = 0; FOR_EACH_BUFFER_REF(br, btrn) { - //PARA_CRIT_LOG("size: %zu\n", size); + if (br->wrap_count != 0) { + wrap_consumed = br->consumed; + continue; + } size += br_available_bytes(br); } + assert(wrap_consumed <= size); + size -= wrap_consumed; return size; } @@ -778,8 +794,7 @@ int btr_node_status(struct btr_node *btrn, size_t min_iqs, { size_t iqs; - if (!btrn) - return 0; + assert(btrn); if (type != BTR_NT_LEAF) { if (btr_no_children(btrn)) return -E_BTR_NO_CHILD;