From bcea04fa816d0c0eb5469af6117b1014de8f87ca Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 30 Mar 2013 21:30:54 +0000 Subject: [PATCH] btr: Simplify btr_node_status(). This changes btr_node_status() to check for errors before looking at queue sizes. In certain cases this avoids to call the possibly expensive btr_get_output_queue_size(). If no more input is going to arrive for an internal node whose output queue is full, btr_node_status() now returns EOF immediately, which is better than the previous scheme where we waited for the output queue to become empty before returning EOF. --- buffer_tree.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/buffer_tree.c b/buffer_tree.c index 84dc933a..56ab2b24 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -1203,21 +1203,20 @@ int btr_node_status(struct btr_node *btrn, size_t min_iqs, size_t iqs; assert(btrn); - if (type != BTR_NT_LEAF) { - if (btr_no_children(btrn)) - return -E_BTR_NO_CHILD; - if (btr_get_output_queue_size(btrn) > BTRN_MAX_PENDING) - return 0; - } - if (type != BTR_NT_ROOT) { - if (btr_eof(btrn)) - return -E_BTR_EOF; - 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; - } + if (type != BTR_NT_LEAF && btr_no_children(btrn)) + return -E_BTR_NO_CHILD; + if (type != BTR_NT_ROOT && btr_eof(btrn)) + return -E_BTR_EOF; + + if (btr_get_output_queue_size(btrn) > BTRN_MAX_PENDING) + return 0; + if (type == BTR_NT_ROOT) + return 1; + 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; } -- 2.39.5