nginx-0.0.1-2003-12-19-11:15:11 import
diff --git a/src/core/nginx.c b/src/core/nginx.c
index 36a8b4b..7deb24f 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -72,7 +72,7 @@
     int               i;
     ngx_fd_t          fd;
     ngx_log_t        *log;
-    ngx_cycle_t      *cycle;
+    ngx_cycle_t      *cycle, init_cycle;
     ngx_open_file_t  *file;
 #if !(WIN32)
     size_t            len;
@@ -88,10 +88,19 @@
     /* TODO */ ngx_max_sockets = -1;
 
     ngx_time_init();
+#if (HAVE_PCRE)
     ngx_regex_init();
+#endif
 
     log = ngx_log_init_errlog();
 
+
+    /* init_cycle->log is required for signal handlers */
+
+    ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));
+    init_cycle.log = log;
+    ngx_cycle = &init_cycle;
+
     if (ngx_os_init(log) == NGX_ERROR) {
         return 1;
     }
@@ -207,7 +216,7 @@
                 }
 
                 if (rotate) {
-                    ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "rotating logs");
+                    ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs");
 
                     file = cycle->open_files.elts;
                     for (i = 0; i < cycle->open_files.nelts; i++) {
diff --git a/src/core/ngx_atomic.h b/src/core/ngx_atomic.h
new file mode 100644
index 0000000..b24a997
--- /dev/null
+++ b/src/core/ngx_atomic.h
@@ -0,0 +1,13 @@
+#ifndef _NGX_ATOMIC_H_INCLUDED_
+#define _NGX_ATOMIC_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+#define ngx_atomic_inc(x)   x++;
+#define ngx_atomic_dec(x)   x--;
+
+
+#endif /* _NGX_ATOMIC_H_INCLUDED_ */
diff --git a/src/core/ngx_core.h b/src/core/ngx_core.h
index b2c3d55..75658ba 100644
--- a/src/core/ngx_core.h
+++ b/src/core/ngx_core.h
@@ -15,6 +15,7 @@
 typedef struct ngx_connection_s  ngx_connection_t;
 
 
+#include <ngx_atomic.h>
 #include <ngx_time.h>
 #include <ngx_socket.h>
 #include <ngx_errno.h>
@@ -30,7 +31,9 @@
 #include <ngx_file.h>
 #include <ngx_files.h>
 #include <ngx_crc.h>
+#if (HAVE_PCRE)
 #include <ngx_regex.h>
+#endif
 #include <ngx_rbtree.h>
 #include <ngx_times.h>
 #include <ngx_inet.h>
diff --git a/src/core/ngx_rbtree.c b/src/core/ngx_rbtree.c
index 3e6025f..dc60551 100644
--- a/src/core/ngx_rbtree.c
+++ b/src/core/ngx_rbtree.c
@@ -31,7 +31,7 @@
     /* a binary tree insert */
 
     if (*root == sentinel) {
-        node->parent = sentinel;
+        node->parent = NULL;
         node->left = sentinel;
         node->right = sentinel;
         ngx_rbt_black(node);
@@ -71,7 +71,7 @@
 
     ngx_rbt_red(node);
 
-    while (node->parent && ngx_rbt_is_red(node->parent)) {
+    while (node != *root && ngx_rbt_is_red(node->parent)) {
 
         if (node->parent == node->parent->parent->left) {
             temp = node->parent->parent->right;
@@ -123,61 +123,90 @@
 void ngx_rbtree_delete(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
                        ngx_rbtree_t *node)
 {
+    ngx_int_t      red;
     ngx_rbtree_t  *subst, *temp, *w;
 
     /* a binary tree delete */
 
-    if (node->left == sentinel || node->right == sentinel) {
+    if (node->left == sentinel) {
+        temp = node->right;
+        subst = node;
+
+    } else if (node->right == sentinel) {
+        temp = node->left;
         subst = node;
 
     } else {
+        subst = ngx_rbtree_min(node->right, sentinel);
 
-        /* find a node successor */
-
-        if (node->right == sentinel) {
-            temp = node;
-            subst = node->parent;
-
-            while (subst != sentinel && temp == subst->right) {
-                 temp = subst;
-                 subst = subst->parent;
-            }
-
+        if (subst->left != sentinel) {
+            temp = subst->left;
         } else {
-            subst = ngx_rbtree_min(node->right, sentinel);
+            temp = subst->right;
         }
     }
 
-    if (subst->left != sentinel) {
-        temp = subst->left;
-    } else {
-        temp = subst->right;
+    if (subst == *root) {
+        /* it's the last node */
+        *root = sentinel;
+        return;
     }
 
-    temp->parent = subst->parent;
+    red = ngx_rbt_is_red(subst);
 
-    if (subst->parent == sentinel) {
-        *root = temp;
-
-    } else if (subst == subst->parent->left) {
+    if (subst == subst->parent->left) {
         subst->parent->left = temp;
 
     } else {
         subst->parent->right = temp;
     }
 
-    if (subst != node) {
-        node->key = subst->key;
-        node->color = subst->color;
+    if (subst == node) {
+
+        temp->parent = subst->parent;
+
+    } else {
+
+        if (subst->parent == node) {
+            temp->parent = subst;
+
+        } else {
+            temp->parent = subst->parent;
+        }
+
+        subst->left = node->left;
+        subst->right = node->right;
+        subst->parent = node->parent;
+        ngx_rbt_copy_color(subst, node);
+
+        if (node == *root) {
+            *root = subst;
+
+        } else {
+            if (node == node->parent->left) {
+                node->parent->left = subst;
+            } else {
+                node->parent->right = subst;
+            }
+        }
+
+        if (subst->left != sentinel) {
+            subst->left->parent = subst;
+        }
+
+        if (subst->right != sentinel) {
+            subst->right->parent = subst;
+        }
     }
 
-    if (ngx_rbt_is_red(subst)) {
+    if (red) {
         return;
     }
 
     /* a delete fixup */
 
-    while (temp->parent != sentinel && ngx_rbt_is_black(temp)) {
+    while (temp != *root && ngx_rbt_is_black(temp)) {
+
         if (temp == temp->parent->left) {
             w = temp->parent->right;
 
@@ -257,7 +286,7 @@
 
     temp->parent = node->parent;
 
-    if (node->parent == sentinel) {
+    if (node == *root) {
         *root = temp;
 
     } else if (node == node->parent->left) {
@@ -287,7 +316,7 @@
 
     temp->parent = node->parent;
 
-    if (node->parent == sentinel) {
+    if (node == *root) {
         *root = temp;
 
     } else if (node == node->parent->right) {