X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=rbtree.c;h=883bc7231d0905b114e45fb57c9a0b525e252b98;hp=7cff649821e85260014efc0aca4916221575962b;hb=8f2b1374214f6165a55daa6be602021b991418d5;hpb=88c46b66d60db5a498487e22b32124cb6bf8576a diff --git a/rbtree.c b/rbtree.c index 7cff6498..883bc723 100644 --- a/rbtree.c +++ b/rbtree.c @@ -300,3 +300,34 @@ struct rb_node *rb_first(struct rb_root *root) n = n->rb_left; return n; } + +struct rb_node *rb_next(const struct rb_node *node) +{ + struct rb_node *parent; + + if (RB_EMPTY_NODE(node)) + return NULL; + + /* + * If we have a right-hand child, go down and then left as far + * as we can. + */ + if (node->rb_right) { + node = node->rb_right; + while (node->rb_left) + node=node->rb_left; + return (struct rb_node *)node; + } + + /* + * No right-hand children. Everything down and left is smaller than us, + * so any 'next' node must be in the general direction of our parent. + * Go up the tree; any time the ancestor is a right-hand child of its + * parent, keep going up. First time it's a left-hand child of its + * parent, said parent is our 'next' node. + */ + while ((parent = rb_parent(node)) && node == parent->rb_right) + node = parent; + + return parent; +}