projects
/
paraslash.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add btr_bytes_pending().
[paraslash.git]
/
buffer_tree.c
diff --git
a/buffer_tree.c
b/buffer_tree.c
index ba2a08754f33a794a19309a1fd7287b749a0f9e5..941d58dba07521dc773721b93262b56ea2466f4f 100644
(file)
--- a/
buffer_tree.c
+++ b/
buffer_tree.c
@@
-4,7
+4,7
@@
#include "para.h"
#include "list.h"
#include "string.h"
#include "para.h"
#include "list.h"
#include "string.h"
-
//
#include "buffer_tree.h"
+#include "buffer_tree.h"
struct btr_buffer {
struct btr_buffer {
@@
-33,18
+33,16
@@
struct btr_node {
* the list represents an input buffer which has not been completely
* used by this btr node.
*/
* the list represents an input buffer which has not been completely
* used by this btr node.
*/
- struct list_head
buffer
_queue;
+ struct list_head
input
_queue;
};
};
-#define FOR_EACH_
TARGET_NODE
(_tn, _btrn) list_for_each_entry((_tn), \
+#define FOR_EACH_
CHILD
(_tn, _btrn) list_for_each_entry((_tn), \
&((_btrn)->children), node)
#define FOR_EACH_BUFFER_REF(_br, _btrn) \
&((_btrn)->children), node)
#define FOR_EACH_BUFFER_REF(_br, _btrn) \
- list_for_each_entry((_br), &(_btrn)->
buffer
_queue, node)
+ list_for_each_entry((_br), &(_btrn)->
input
_queue, node)
#define FOR_EACH_BUFFER_REF_SAFE(_br, _tmp, _btrn) \
#define FOR_EACH_BUFFER_REF_SAFE(_br, _tmp, _btrn) \
- list_for_each_entry_safe((_br), (_tmp), &(_btrn)->buffer_queue, node)
-
-INIT_STDERR_LOGGING(0);
+ list_for_each_entry_safe((_br), (_tmp), &(_btrn)->input_queue, node)
struct btr_node *btr_new_node(char *name, struct btr_node *parent)
{
struct btr_node *btr_new_node(char *name, struct btr_node *parent)
{
@@
-55,10
+53,15
@@
struct btr_node *btr_new_node(char *name, struct btr_node *parent)
if (parent)
list_add_tail(&btrn->node, &parent->children);
INIT_LIST_HEAD(&btrn->children);
if (parent)
list_add_tail(&btrn->node, &parent->children);
INIT_LIST_HEAD(&btrn->children);
- INIT_LIST_HEAD(&btrn->
buffer
_queue);
+ INIT_LIST_HEAD(&btrn->
input
_queue);
return btrn;
}
return btrn;
}
+/*
+ * Allocate a new btr buffer.
+ *
+ * The freshly allocated buffer will have a zero refcount.
+ */
static struct btr_buffer *new_btrb(char *buf, size_t size)
{
struct btr_buffer *btrb = para_malloc(sizeof(*btrb));
static struct btr_buffer *new_btrb(char *buf, size_t size)
{
struct btr_buffer *btrb = para_malloc(sizeof(*btrb));
@@
-69,7
+72,10
@@
static struct btr_buffer *new_btrb(char *buf, size_t size)
return btrb;
}
return btrb;
}
-void btr_drop_buffer_reference(struct btr_buffer_reference *br)
+/*
+ * Deallocate the reference, release the resources if refcount drops to zero.
+ */
+static void btr_drop_buffer_reference(struct btr_buffer_reference *br)
{
struct btr_buffer *btrb = br->btrb;
{
struct btr_buffer *btrb = br->btrb;
@@
-82,15
+88,15
@@
void btr_drop_buffer_reference(struct btr_buffer_reference *br)
}
}
}
}
-static void add_btrb_to_
targets
(struct btr_buffer *btrb, struct btr_node *btrn)
+static void add_btrb_to_
children
(struct btr_buffer *btrb, struct btr_node *btrn)
{
{
- struct btr_node *
tn; /* target node */
+ struct btr_node *
ch;
- FOR_EACH_
TARGET_NODE(tn
, btrn) {
+ FOR_EACH_
CHILD(ch
, btrn) {
struct btr_buffer_reference *br = para_malloc(sizeof(*br));
br->btrb = btrb;
br->consumed = 0;
struct btr_buffer_reference *br = para_malloc(sizeof(*br));
br->btrb = btrb;
br->consumed = 0;
- list_add_tail(&br->node, &
tn->buffer
_queue);
+ list_add_tail(&br->node, &
ch->input
_queue);
btrb->refcount++;
}
}
btrb->refcount++;
}
}
@@
-100,12
+106,12
@@
void btr_add_output(char *buf, size_t size, struct btr_node *btrn)
struct btr_buffer *btrb;
btrb = new_btrb(buf, size);
struct btr_buffer *btrb;
btrb = new_btrb(buf, size);
- add_btrb_to_
targets
(btrb, btrn);
+ add_btrb_to_
children
(btrb, btrn);
}
}
-void btr_pushdown_br(struct btr_buffer_reference *br, struct btr_node *btrn)
+
static
void btr_pushdown_br(struct btr_buffer_reference *br, struct btr_node *btrn)
{
{
- add_btrb_to_
targets
(br->btrb, btrn);
+ add_btrb_to_
children
(br->btrb, btrn);
btr_drop_buffer_reference(br);
}
btr_drop_buffer_reference(br);
}
@@
-117,7
+123,8
@@
void btr_pushdown(struct btr_node *btrn)
btr_pushdown_br(br, btrn);
}
btr_pushdown_br(br, btrn);
}
-bool btr_no_children(struct btr_node *btrn)
+/* Return true if this node has no children. */
+bool btr_is_leaf_node(struct btr_node *btrn)
{
return list_empty(&btrn->children);
}
{
return list_empty(&btrn->children);
}
@@
-136,11
+143,12
@@
bool btr_inplace_ok(struct btr_node *btrn)
struct btr_buffer_reference *btr_next_br(struct btr_node *btrn)
{
struct btr_buffer_reference *btr_next_br(struct btr_node *btrn)
{
- if (list_empty(&btrn->
buffer
_queue))
+ if (list_empty(&btrn->
input
_queue))
return NULL;
return NULL;
- return list_first_entry(&btrn->
buffer
_queue, struct btr_buffer_reference, node);
+ return list_first_entry(&btrn->
input
_queue, struct btr_buffer_reference, node);
}
}
+
static inline size_t br_available_bytes(struct btr_buffer_reference *br)
{
return br->btrb->size - br->consumed;
static inline size_t br_available_bytes(struct btr_buffer_reference *br)
{
return br->btrb->size - br->consumed;
@@
-168,10
+176,10
@@
static void flush_input_queue(struct btr_node *btrn)
void btr_del_node(struct btr_node *btrn)
{
void btr_del_node(struct btr_node *btrn)
{
- struct btr_node *
tn
;
+ struct btr_node *
ch
;
- FOR_EACH_
TARGET_NODE(tn
, btrn)
-
tn
->parent = NULL;
+ FOR_EACH_
CHILD(ch
, btrn)
+
ch
->parent = NULL;
flush_input_queue(btrn);
if (btrn->parent)
list_del(&btrn->node);
flush_input_queue(btrn);
if (btrn->parent)
list_del(&btrn->node);
@@
-189,7
+197,19
@@
size_t btr_get_input_queue_size(struct btr_node *btrn)
return size;
}
return size;
}
-int main(void)
+/**
+ * Return the size of the largest input queue.
+ *
+ * Iterates over all children of the given node.
+ */
+size_t btr_bytes_pending(struct btr_node *btrn)
{
{
- return 1;
+ size_t max_size = 0;
+ struct btr_node *ch;
+
+ FOR_EACH_CHILD(ch, btrn) {
+ size_t size = btr_get_input_queue_size(ch);
+ max_size = PARA_MAX(max_size, size);
+ }
+ return max_size;
}
}