nginx-0.3.1-RELEASE import

    *) Bugfix: the segmentation fault occurred when the signal queue
       overflowed if the "rtsig" method was used; the bug had appeared in
       0.2.0.

    *) Change: correct handling of the "\\", "\"", "\'", and "\$" pairs in
       SSI.
diff --git a/src/core/nginx.h b/src/core/nginx.h
index 734c401..22c632f 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
 #define _NGINX_H_INCLUDED_
 
 
-#define NGINX_VER          "nginx/0.3.0"
+#define NGINX_VER          "nginx/0.3.1"
 
 #define NGINX_VAR          "NGINX"
 #define NGX_OLDPID_EXT     ".oldbin"
diff --git a/src/core/ngx_core.h b/src/core/ngx_core.h
index 27058bf..9efbecd 100644
--- a/src/core/ngx_core.h
+++ b/src/core/ngx_core.h
@@ -35,15 +35,15 @@
 #define  NGX_ABORT      -6
 
 
+#include <ngx_errno.h>
 #include <ngx_atomic.h>
+#include <ngx_thread.h>
 #include <ngx_rbtree.h>
 #include <ngx_time.h>
 #include <ngx_socket.h>
-#include <ngx_errno.h>
 #include <ngx_types.h>
 #include <ngx_shared.h>
 #include <ngx_process.h>
-#include <ngx_thread.h>
 #include <ngx_user.h>
 #include <ngx_string.h>
 #include <ngx_parse.h>
diff --git a/src/core/ngx_rbtree.c b/src/core/ngx_rbtree.c
index 1ebc56a..3c42be4 100644
--- a/src/core/ngx_rbtree.c
+++ b/src/core/ngx_rbtree.c
@@ -9,8 +9,8 @@
 
 
 /*
- * The code is based on the algorithm described in the "Introduction
- * to Algorithms" by Cormen, Leiserson and Rivest.
+ * The red-black tree code is based on the algorithm described in
+ * the "Introduction to Algorithms" by Cormen, Leiserson and Rivest.
  */
 
 #define ngx_rbt_red(node)           ((node)->color = 1)
@@ -20,20 +20,23 @@
 #define ngx_rbt_copy_color(n1, n2)  (n1->color = n2->color)
 
 
-static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root,
-    ngx_rbtree_t *sentinel, ngx_rbtree_t *node);
-static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root,
-    ngx_rbtree_t *sentinel, ngx_rbtree_t *node);
+static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_node_t **root,
+    ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node);
+static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_node_t **root,
+    ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node);
 
 
 void
-ngx_rbtree_insert(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node)
+ngx_rbtree_insert(ngx_thread_volatile ngx_rbtree_t *tree,
+    ngx_rbtree_node_t *node)
 {
-    ngx_rbtree_t  *temp;
+    ngx_rbtree_node_t  **root, *temp, *sentinel;
 
     /* a binary tree insert */
 
+    root = (ngx_rbtree_node_t **) &tree->root;
+    sentinel = tree->sentinel;
+
     if (*root == sentinel) {
         node->parent = NULL;
         node->left = sentinel;
@@ -44,6 +47,17 @@
         return;
     }
 
+    /*
+     * The rbtree is currently used by event timers only.  Timer values
+     * 1) are spread in small range, usually several minutes,
+     * 2) and overflow each 49 days, if milliseconds are stored in 32 bits.
+     * The below comparison takes into account that overflow.
+     *
+     * If there will be a necessity to use the rbtree for values with
+     * other comparison rules, then a whole "for ( ;; )" loop should
+     * be made as tree->insert() function.
+     */
+
     temp = *root;
 
     for ( ;; ) {
@@ -130,14 +144,17 @@
 
 
 void
-ngx_rbtree_delete(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node)
+ngx_rbtree_delete(ngx_thread_volatile ngx_rbtree_t *tree,
+    ngx_rbtree_node_t *node)
 {
-    ngx_int_t      is_red;
-    ngx_rbtree_t  *subst, *temp, *w;
+    ngx_int_t            is_red;
+    ngx_rbtree_node_t  **root, *sentinel, *subst, *temp, *w;
 
     /* a binary tree delete */
 
+    root = (ngx_rbtree_node_t **) &tree->root;
+    sentinel = tree->sentinel;
+
     if (node->left == sentinel) {
         temp = node->right;
         subst = node;
@@ -295,10 +312,10 @@
 
 
 static ngx_inline void
-ngx_rbtree_left_rotate(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node)
+ngx_rbtree_left_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,
+    ngx_rbtree_node_t *node)
 {
-    ngx_rbtree_t  *temp;
+    ngx_rbtree_node_t  *temp;
 
     temp = node->right;
     node->right = temp->left;
@@ -325,10 +342,10 @@
 
 
 static ngx_inline void
-ngx_rbtree_right_rotate(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node)
+ngx_rbtree_right_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,
+    ngx_rbtree_node_t *node)
 {
-    ngx_rbtree_t  *temp;
+    ngx_rbtree_node_t  *temp;
 
     temp = node->left;
     node->left = temp->right;
diff --git a/src/core/ngx_rbtree.h b/src/core/ngx_rbtree.h
index d6803f9..1b1322d 100644
--- a/src/core/ngx_rbtree.h
+++ b/src/core/ngx_rbtree.h
@@ -16,25 +16,37 @@
 typedef ngx_int_t   ngx_rbtree_key_int_t;
 
 
-typedef struct ngx_rbtree_s  ngx_rbtree_t;
+typedef struct ngx_rbtree_node_s  ngx_rbtree_node_t;
 
-struct ngx_rbtree_s {
-    ngx_rbtree_key_t   key;
-    ngx_rbtree_t      *left;
-    ngx_rbtree_t      *right;
-    ngx_rbtree_t      *parent;
-    char               color;
+struct ngx_rbtree_node_s {
+    ngx_rbtree_key_t       key;
+    ngx_rbtree_node_t     *left;
+    ngx_rbtree_node_t     *right;
+    ngx_rbtree_node_t     *parent;
+    char                   color;
 };
 
 
-void ngx_rbtree_insert(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node);
-void ngx_rbtree_delete(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
-    ngx_rbtree_t *node);
+typedef struct ngx_rbtree_s  ngx_rbtree_t;
+
+typedef ngx_rbtree_t *(*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root,
+    ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
+
+struct ngx_rbtree_s {
+    ngx_rbtree_node_t     *root;
+    ngx_rbtree_node_t     *sentinel;
+ /* ngx_rbtree_insert_pt   insert; */
+};
 
 
-static ngx_inline ngx_rbtree_t *
-ngx_rbtree_min(ngx_rbtree_t *node, ngx_rbtree_t *sentinel)
+void ngx_rbtree_insert(ngx_thread_volatile ngx_rbtree_t *tree,
+    ngx_rbtree_node_t *node);
+void ngx_rbtree_delete(ngx_thread_volatile ngx_rbtree_t *tree,
+    ngx_rbtree_node_t *node);
+
+
+static ngx_inline ngx_rbtree_node_t *
+ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
 {
     while (node->left != sentinel) {
         node = node->left;