From: Andre Noll Date: Sat, 30 Mar 2013 21:30:54 +0000 (+0000) Subject: btr: Simplify btr_node_status(). X-Git-Tag: v0.5.1~9^2 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=bcea04fa816d0c0eb5469af6117b1014de8f87ca;hp=072391fccbd052334dbd836d451f2be0a74a0685 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. --- 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; }