aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2017-03-07 18:51:13 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2017-03-07 18:51:13 +0300
commit0212c7fac1a63d33c9b0084ed75803713af8a230 (patch)
treeba7bc093e84291eaee999accd4237022789a713a
parentc1d8318d3112a2752971d76fc15d1fca8557691d (diff)
downloadnginx-0212c7fac1a63d33c9b0084ed75803713af8a230.tar.gz
nginx-0212c7fac1a63d33c9b0084ed75803713af8a230.zip
Core: introduced ngx_rbtree_next().
-rw-r--r--src/core/ngx_rbtree.c29
-rw-r--r--src/core/ngx_rbtree.h2
2 files changed, 31 insertions, 0 deletions
diff --git a/src/core/ngx_rbtree.c b/src/core/ngx_rbtree.c
index 331254c6f..969d549c8 100644
--- a/src/core/ngx_rbtree.c
+++ b/src/core/ngx_rbtree.c
@@ -378,3 +378,32 @@ ngx_rbtree_right_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,
temp->right = node;
node->parent = temp;
}
+
+
+ngx_rbtree_node_t *
+ngx_rbtree_next(ngx_rbtree_t *tree, ngx_rbtree_node_t *node)
+{
+ ngx_rbtree_node_t *root, *sentinel, *parent;
+
+ sentinel = tree->sentinel;
+
+ if (node->right != sentinel) {
+ return ngx_rbtree_min(node->right, sentinel);
+ }
+
+ root = tree->root;
+
+ for ( ;; ) {
+ parent = node->parent;
+
+ if (node == root) {
+ return NULL;
+ }
+
+ if (node == parent->left) {
+ return parent;
+ }
+
+ node = parent;
+ }
+}
diff --git a/src/core/ngx_rbtree.h b/src/core/ngx_rbtree.h
index 1d33e3f6e..97f0e3e11 100644
--- a/src/core/ngx_rbtree.h
+++ b/src/core/ngx_rbtree.h
@@ -54,6 +54,8 @@ void ngx_rbtree_insert_value(ngx_rbtree_node_t *root, ngx_rbtree_node_t *node,
ngx_rbtree_node_t *sentinel);
void ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *root,
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
+ngx_rbtree_node_t *ngx_rbtree_next(ngx_rbtree_t *tree,
+ ngx_rbtree_node_t *node);
#define ngx_rbt_red(node) ((node)->color = 1)