optimize rbtree initialization and insert
diff --git a/src/core/ngx_open_file_cache.c b/src/core/ngx_open_file_cache.c
index dab98b3..d518f4b 100644
--- a/src/core/ngx_open_file_cache.c
+++ b/src/core/ngx_open_file_cache.c
@@ -53,11 +53,8 @@
         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;
diff --git a/src/core/ngx_rbtree.c b/src/core/ngx_rbtree.c
index 0a5753c..7ee0036 100644
--- a/src/core/ngx_rbtree.c
+++ b/src/core/ngx_rbtree.c
@@ -97,28 +97,20 @@
 ngx_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,
     ngx_rbtree_node_t *sentinel)
 {
+    ngx_rbtree_node_t  **p;
+
     for ( ;; ) {
 
-        if (node->key < temp->key) {
+        p = (node->key < temp->key) ? &temp->left : &temp->right;
 
-            if (temp->left == sentinel) {
-                temp->left = node;
-                break;
-            }
-
-            temp = temp->left;
-
-        } else {
-
-            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;
@@ -130,6 +122,8 @@
 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 @@
          * 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 */
+        /*  node->key < temp->key */
 
-            if (temp->left == sentinel) {
-                temp->left = node;
-                break;
-            }
+        p = ((ngx_rbtree_key_int_t) node->key - (ngx_rbtree_key_int_t) temp->key
+              < 0)
+            ? &temp->left : &temp->right;
 
-            temp = temp->left;
-
-        } else {
-
-            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;