assert(list_empty(&btrn->children));
}
-/*
- * Return the size of the largest input queue.
+/**
+ * Return number of queued output bytes of a buffer tree node.
+ *
+ * \param btrn The node whose output queue size should be computed.
*
- * Iterates over all children of the given node.
+ * This function iterates over all children of the given node and returns the
+ * size of the largest input queue.
*/
-static size_t btr_bytes_pending(struct btr_node *btrn)
+size_t btr_get_output_queue_size(struct btr_node *btrn)
{
size_t max_size = 0;
struct btr_node *ch;
struct btr_buffer_reference *br, *wbr = NULL;
int num_refs; /* including wrap buffer */
char *buf, *buf1 = NULL, *buf2 = NULL;
- size_t sz, sz1 = 0, sz2 = 0, wsz;
+ size_t sz, sz1 = 0, sz2 = 0, wb_consumed = 0;
br = get_first_input_br(btrn);
if (!br || br_available_bytes(br) >= dest_size)
wbr = br;
if (sz >= dest_size)
return;
+ wb_consumed = br->consumed;
continue;
}
if (!buf1) {
assert(buf2 + sz2 == buf);
sz2 += sz;
next:
- if (sz1 + sz2 >= dest_size)
+ if (sz1 + sz2 >= dest_size + wb_consumed)
break;
}
if (!buf2) /* nothing to do */
* We already have a wrap buffer, but it is too small. It might be
* partially used.
*/
- wsz = br_available_bytes(wbr);
if (wbr->wrap_count == sz1 && wbr->btrb->size >= sz1 + sz2) /* nothing we can do about it */
return;
sz = sz1 + sz2 - wbr->btrb->size; /* amount of new data */
if (type != BTR_NT_LEAF) {
if (btr_no_children(btrn))
return -E_BTR_NO_CHILD;
- if (btr_bytes_pending(btrn) > BTRN_MAX_PENDING)
+ if (btr_get_output_queue_size(btrn) > BTRN_MAX_PENDING)
return 0;
}
if (type != BTR_NT_ROOT) {