]> git.kaiwu.me - nginx.git/commitdiff
optimize rbtree initialization and insert
authorIgor Sysoev <igor@sysoev.ru>
Mon, 17 Dec 2007 08:52:00 +0000 (08:52 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 17 Dec 2007 08:52:00 +0000 (08:52 +0000)
src/core/ngx_open_file_cache.c
src/core/ngx_rbtree.c
src/event/ngx_event_openssl.c
src/event/ngx_event_timer.c
src/http/modules/ngx_http_limit_zone_module.c

index dab98b3ff3c1eff0001f67213f81e4e2eeca254f..d518f4b960b272a71ef5dcc6929d0c238fd4b11f 100644 (file)
@@ -53,11 +53,8 @@ ngx_open_file_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t inactive)
         return NULL;
     }
 
-    ngx_rbtree_sentinel_init(sentinel);
-
-    cache->rbtree.root = sentinel;
-    cache->rbtree.sentinel = sentinel;
-    cache->rbtree.insert = ngx_open_file_cache_rbtree_insert_value;
+    ngx_rbtree_init(&cache->rbtree, sentinel,
+                    ngx_open_file_cache_rbtree_insert_value);
 
     cache->current = 0;
     cache->max = max;
index 0a5753cdff6af94afd5d25386ebe996c5efca527..7ee0036ec2accdaf1c54999792efeaf14b974066 100644 (file)
@@ -97,28 +97,20 @@ void
 ngx_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,
     ngx_rbtree_node_t *sentinel)
 {
-    for ( ;; ) {
-
-        if (node->key < temp->key) {
-
-            if (temp->left == sentinel) {
-                temp->left = node;
-                break;
-            }
-
-            temp = temp->left;
+    ngx_rbtree_node_t  **p;
 
-        } else {
+    for ( ;; ) {
 
-            if (temp->right == sentinel) {
-                temp->right = node;
-                break;
-            }
+        p = (node->key < temp->key) ? &temp->left : &temp->right;
 
-            temp = temp->right;
+        if (*p == sentinel) {
+            break;
         }
+
+        temp = *p;
     }
 
+    *p = node;
     node->parent = temp;
     node->left = sentinel;
     node->right = sentinel;
@@ -130,6 +122,8 @@ void
 ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,
     ngx_rbtree_node_t *sentinel)
 {
+    ngx_rbtree_node_t  **p;
+
     for ( ;; ) {
 
         /*
@@ -139,29 +133,20 @@ ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,
          * The comparison takes into account that overflow.
          */
 
-        if ((ngx_rbtree_key_int_t) node->key - (ngx_rbtree_key_int_t) temp->key
-            < 0)
-        {
-            /*  node->key < temp->key */
-
-            if (temp->left == sentinel) {
-                temp->left = node;
-                break;
-            }
+        /*  node->key < temp->key */
 
-            temp = temp->left;
-
-        } else {
+        p = ((ngx_rbtree_key_int_t) node->key - (ngx_rbtree_key_int_t) temp->key
+              < 0)
+            ? &temp->left : &temp->right;
 
-            if (temp->right == sentinel) {
-                temp->right = node;
-                break;
-            }
-
-            temp = temp->right;
+        if (*p == sentinel) {
+            break;
         }
-    }
 
+        temp = *p;
+    }
+      
+    *p = node;
     node->parent = temp;
     node->left = sentinel;
     node->right = sentinel;
index be24d9c7746dc2d77db6331198d396a2a84ee81b..bd539c9a314dd77a64328cc92e377cac0fc1f1d2 100644 (file)
@@ -1241,11 +1241,8 @@ ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data)
         return NGX_ERROR;
     }
 
-    ngx_rbtree_sentinel_init(sentinel);
-
-    cache->session_rbtree->root = sentinel;
-    cache->session_rbtree->sentinel = sentinel;
-    cache->session_rbtree->insert = ngx_ssl_session_rbtree_insert_value;
+    ngx_rbtree_init(cache->session_rbtree, sentinel,
+                    ngx_ssl_session_rbtree_insert_value);
 
     shm_zone->data = cache;
 
@@ -1625,56 +1622,37 @@ static void
 ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp,
     ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
 {
-    ngx_ssl_sess_id_t  *sess_id, *sess_id_temp;
+    ngx_rbtree_node_t  **p;
+    ngx_ssl_sess_id_t   *sess_id, *sess_id_temp;
 
     for ( ;; ) {
 
         if (node->key < temp->key) {
 
-            if (temp->left == sentinel) {
-                temp->left = node;
-                break;
-            }
-
-            temp = temp->left;
+            p = &temp->left;
 
         } else if (node->key > temp->key) {
 
-            if (temp->right == sentinel) {
-                temp->right = node;
-                break;
-            }
-
-            temp = temp->right;
+            p = &temp->right;
 
         } else { /* node->key == temp->key */
 
             sess_id = (ngx_ssl_sess_id_t *) node;
             sess_id_temp = (ngx_ssl_sess_id_t *) temp;
 
-            if (ngx_memn2cmp(sess_id->id, sess_id_temp->id,
-                             (size_t) node->data, (size_t) temp->data)
-                < 0)
-            {
-                if (temp->left == sentinel) {
-                    temp->left = node;
-                    break;
-                }
-
-                temp = temp->left;
-
-            } else {
-
-                if (temp->right == sentinel) {
-                    temp->right = node;
-                    break;
-                }
+            p = (ngx_memn2cmp(sess_id->id, sess_id_temp->id,
+                              (size_t) node->data, (size_t) temp->data)
+                 < 0) ? &temp->left : &temp->right;
+        }
 
-                temp = temp->right;
-            }
+        if (*p == sentinel) {
+            break;
         }
+
+        temp = *p;
     }
 
+    *p = node;
     node->parent = temp;
     node->left = sentinel;
     node->right = sentinel;
index 589de6d41282ed9cf91a13a253515f6866c3e2b2..2931a9f4e2e58a3ad9c60c46b9cc19d83443414a 100644 (file)
@@ -26,9 +26,8 @@ static ngx_rbtree_node_t          ngx_event_timer_sentinel;
 ngx_int_t
 ngx_event_timer_init(ngx_log_t *log)
 {
-    ngx_event_timer_rbtree.root = &ngx_event_timer_sentinel;
-    ngx_event_timer_rbtree.sentinel = &ngx_event_timer_sentinel;
-    ngx_event_timer_rbtree.insert = ngx_rbtree_insert_timer_value;
+    ngx_rbtree_init(&ngx_event_timer_rbtree, &ngx_event_timer_sentinel,
+                    ngx_rbtree_insert_timer_value);
 
 #if (NGX_THREADS)
 
index a0be6f107cab1f5ad14972bd3f38102ee699fefb..c7a3753d9f35665973594810a922a4241c83a835 100644 (file)
@@ -239,54 +239,36 @@ static void
 ngx_http_limit_zone_rbtree_insert_value(ngx_rbtree_node_t *temp,
     ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
 {
-    ngx_http_limit_zone_node_t  *lzn, *lznt;
+    ngx_rbtree_node_t           **p;
+    ngx_http_limit_zone_node_t   *lzn, *lznt;
 
     for ( ;; ) {
 
         if (node->key < temp->key) {
 
-            if (temp->left == sentinel) {
-                temp->left = node;
-                break;
-            }
-
-            temp = temp->left;
+            p = &temp->left;
 
         } else if (node->key > temp->key) {
 
-            if (temp->right == sentinel) {
-                temp->right = node;
-                break;
-            }
-
-            temp = temp->right;
+            p = &temp->right;
 
         } else { /* node->key == temp->key */
 
             lzn = (ngx_http_limit_zone_node_t *) &node->color;
             lznt = (ngx_http_limit_zone_node_t *) &temp->color;
 
-            if (ngx_memn2cmp(lzn->data, lznt->data, lzn->len, lznt->len) < 0) {
-
-                if (temp->left == sentinel) {
-                    temp->left = node;
-                    break;
-                }
-
-                temp = temp->left;
-
-            } else {
-
-                if (temp->right == sentinel) {
-                    temp->right = node;
-                    break;
-                }
+            p = (ngx_memn2cmp(lzn->data, lznt->data, lzn->len, lznt->len) < 0)
+                ? &temp->left : &temp->right;
+        }
 
-                temp = temp->right;
-            }
+        if (*p == sentinel) {
+            break;
         }
+
+        temp = *p;
     }
 
+    *p = node;
     node->parent = temp;
     node->left = sentinel;
     node->right = sentinel;
@@ -362,11 +344,8 @@ ngx_http_limit_zone_init_zone(ngx_shm_zone_t *shm_zone, void *data)
         return NGX_ERROR;
     }
 
-    ngx_rbtree_sentinel_init(sentinel);
-
-    ctx->rbtree->root = sentinel;
-    ctx->rbtree->sentinel = sentinel;
-    ctx->rbtree->insert = ngx_http_limit_zone_rbtree_insert_value;
+    ngx_rbtree_init(ctx->rbtree, sentinel,
+                    ngx_http_limit_zone_rbtree_insert_value);
 
     return NGX_OK;
 }