From: Willy Tarreau Date: Mon, 13 Nov 2017 18:13:06 +0000 (+0100) Subject: MINOR: ebtree/scope: add a function to find next node from a parent X-Git-Tag: v1.8-rc4~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6ac365d8dac0aad8d0b8cf1cec918858ee17169;p=thirdparty%2Fhaproxy.git MINOR: ebtree/scope: add a function to find next node from a parent Several parts of the code need to access the next node but don't start from a node but a tagged parent link. Even eb32sc_next() does this. Let's provide this function to prepare a cleanup for the lookup function. --- diff --git a/ebtree/eb32sctree.h b/ebtree/eb32sctree.h index 8a8dcf1021..be469baa66 100644 --- a/ebtree/eb32sctree.h +++ b/ebtree/eb32sctree.h @@ -108,22 +108,25 @@ static inline struct eb32sc_node *eb32sc_walk_down_left(eb_troot_t *start, unsig } } -/* Return next node in the tree, or NULL if none */ -static inline struct eb32sc_node *eb32sc_next(struct eb32sc_node *eb32, unsigned long scope) +/* Return next node in the tree, starting with tagged parent , or NULL if none */ +static inline struct eb32sc_node *eb32sc_next_with_parent(eb_troot_t *start, unsigned long scope) { - struct eb_node *node = &eb32->node; - eb_troot_t *t = node->leaf_p; - - while (eb_gettag(t) != EB_LEFT) + while (eb_gettag(start) != EB_LEFT) /* Walking up from right branch, so we cannot be below root */ - t = (eb_root_to_node(eb_untag(t, EB_RGHT)))->node_p; + start = (eb_root_to_node(eb_untag(start, EB_RGHT)))->node_p; /* Note that cannot be NULL at this stage */ - t = (eb_untag(t, EB_LEFT))->b[EB_RGHT]; - if (eb_clrtag(t) == NULL) + start = (eb_untag(start, EB_LEFT))->b[EB_RGHT]; + if (eb_clrtag(start) == NULL) return NULL; - return eb32sc_walk_down_left(t, scope); + return eb32sc_walk_down_left(start, scope); +} + +/* Return next node in the tree, or NULL if none */ +static inline struct eb32sc_node *eb32sc_next(struct eb32sc_node *eb32, unsigned long scope) +{ + return eb32sc_next_with_parent(eb32->node.leaf_p, scope); } /* Return leftmost node in the tree, or NULL if none */