X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=buffer_tree.c;h=2c02c69466f19111241aa835dd2f919cf710ecc0;hp=1bc9529884dc16b779ee232022e6bb37ccee0e2d;hb=05492521d51352fa8c4f55b71b33e14656f0bd0d;hpb=509881dc2004a449e1da378ca22b164546a50d32 diff --git a/buffer_tree.c b/buffer_tree.c index 1bc95298..2c02c694 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -166,6 +166,9 @@ size_t btr_get_buffer_by_reference(struct btr_buffer_reference *br, char **buf) return br_available_bytes(br); } +/** + * \return zero if the input buffer queue is empty. + */ size_t btr_next_buffer(struct btr_node *btrn, char **bufp) { struct btr_buffer_reference *br; @@ -225,15 +228,13 @@ size_t btr_get_input_queue_size(struct btr_node *btrn) return size; } -int btr_splice_out_node(struct btr_node *btrn) +void btr_splice_out_node(struct btr_node *btrn) { struct btr_node *ch, *tmp; - if (!btrn) - return -ERRNO_TO_PARA_ERROR(EINVAL); - if (btr_get_input_queue_size(btrn) != 0) - return -ERRNO_TO_PARA_ERROR(EINVAL); + assert(btrn); PARA_NOTICE_LOG("splicing out %s\n", btrn->name); + btr_pushdown(btrn); if (btrn->parent) list_del(&btrn->node); FOR_EACH_CHILD_SAFE(ch, tmp, btrn) { @@ -246,7 +247,6 @@ int btr_splice_out_node(struct btr_node *btrn) assert(list_empty(&btrn->children)); free(btrn->name); free(btrn); - return 1; } /** @@ -309,7 +309,7 @@ void *btr_context(struct btr_node *btrn) * * This is a quite expensive operation. * - * \return The number of buffers that have been merged (zero, one or two). + * \return The number of buffers that have been available (zero, one or two). */ int btr_merge(struct btr_node *btrn) { @@ -351,3 +351,15 @@ int btr_merge(struct btr_node *btrn) para_list_add(&br->node, &btrn->input_queue); return 2; } + +void btr_merge_to(struct btr_node *btrn, size_t dest_size) +{ + for (;;) { + char *buf; + size_t len = btr_next_buffer(btrn, &buf); + if (len >= dest_size) + return; + if (btr_merge(btrn) < 2) + return; + } +}