btr_drop_buffer_reference(br);
}
-void btr_del_node(struct btr_node *btrn)
+void btr_free_node(struct btr_node *btrn)
+{
+ if (!btrn)
+ return;
+ free(btrn->name);
+ free(btrn);
+}
+
+void btr_remove_node(struct btr_node *btrn)
{
struct btr_node *ch;
if (!btrn)
return;
- PARA_NOTICE_LOG("deleting %s\n", btrn->name);
+ PARA_NOTICE_LOG("removing btr node %s from buffer tree\n", btrn->name);
FOR_EACH_CHILD(ch, btrn)
ch->parent = NULL;
flush_input_queue(btrn);
if (btrn->parent)
list_del(&btrn->node);
- free(btrn->name);
- free(btrn);
}
size_t btr_get_input_queue_size(struct btr_node *btrn)
list_move(&ch->node, &btrn->parent->children);
}
assert(list_empty(&btrn->children));
- free(btrn->name);
- free(btrn);
}
/**
{
return log_tree_recursively(btrn, loglevel, 0);
}
+
+/** 640K ought to be enough for everybody ;) */
+#define BTRN_MAX_PENDING (640 * 1024)
+
+int btr_node_status(struct btr_node *btrn, size_t min_iqs)
+{
+ size_t iqs;
+
+ if (btr_eof(btrn))
+ return -E_BTR_EOF;
+ if (btr_bytes_pending(btrn) > BTRN_MAX_PENDING)
+ return 0;
+ iqs = btr_get_input_queue_size(btrn);
+ if (iqs == 0) /* we have a parent, because not eof */
+ return 0;
+ if (iqs < min_iqs && !btr_no_parent(btrn))
+ return 0;
+ return 1;
+}