nginx-0.0.3-2004-04-14-21:44:28 import
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c
index 4b76f86..cad7ed9 100644
--- a/src/event/modules/ngx_epoll_module.c
+++ b/src/event/modules/ngx_epoll_module.c
@@ -356,7 +356,11 @@
     timer = ngx_event_find_timer();
     ngx_old_elapsed_msec = ngx_elapsed_msec;
 
-    if (timer == 0) {
+    if (timer == -1) {
+        timer = 0;
+        expire = 1;
+
+    } else if (timer == 0) {
         timer = (ngx_msec_t) -1;
         expire = 0;
 
@@ -369,7 +373,9 @@
             return NGX_ERROR;
         }
 
-        if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) {
+        if (ngx_accept_mutex_held == 0
+            && (timer == -1 || timer > ngx_accept_mutex_delay))
+        {
             timer = ngx_accept_mutex_delay;
             expire = 0;
         }
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 454d7db..bf37bf5 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -383,7 +383,12 @@
         }
     }
 
-    if (timer) {
+    if (timer == -1) {
+        ts.tv_sec = 0;
+        ts.tv_nsec = 0;
+        tp = &ts;
+
+    } else if (timer) {
         ts.tv_sec = timer / 1000;
         ts.tv_nsec = (timer % 1000) * 1000000;
         tp = &ts;
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index dd98eca..ffe59d4 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -125,6 +125,8 @@
 
     c = ev->data;
 
+    ev->active = 1;
+
     if (ev->index != NGX_INVALID_INDEX) {
         ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
                       "poll event fd:%d ev:%d is already set", c->fd, event);
@@ -163,7 +165,6 @@
         ev->index = e->index;
     }
 
-    ev->active = 1;
     ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
 
     return NGX_OK;
@@ -278,7 +279,11 @@
     } else {
         timer = ngx_event_find_timer();
 
-        if (timer == 0) {
+        if (timer == -1) {
+            timer = 0;
+            expire = 1;
+
+        } else if (timer == 0) {
             timer = (ngx_msec_t) INFTIM;
             expire = 0;
 
@@ -302,7 +307,9 @@
             return NGX_ERROR;
         }
 
-        if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) {
+        if (ngx_accept_mutex_held == 0 
+            && (timer == (ngx_msec_t) INFTIM || timer > ngx_accept_mutex_delay))
+        {
             timer = ngx_accept_mutex_delay;
             expire = 0;
         }
@@ -348,8 +355,11 @@
         }
     }
 
-    if (timer == 0 && ready == 0) {
+    if ((ngx_event_flags & NGX_OVERFLOW_EVENT) && timer == 0 && ready == 0) {
+
         /* the overflowed rt signals queue has been drained */
+
+        ngx_accept_mutex_unlock();
         return NGX_OK;
     }
 
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index 596ee6a..0f3848d 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -263,34 +263,26 @@
     static ngx_epoch_msec_t   deltas = 0;
 #endif
 
-    work_read_fd_set = master_read_fd_set;
-    work_write_fd_set = master_write_fd_set;
-
     timer = ngx_event_find_timer();
     ngx_old_elapsed_msec = ngx_elapsed_msec;
 
-    if (timer) {
-        tv.tv_sec = timer / 1000;
-        tv.tv_usec = (timer % 1000) * 1000;
-        tp = &tv;
-        expire = 1;
-
-    } else {
-        tp = NULL;
-        expire = 0;
-    }
-
-#if (NGX_DEBUG)
-    for (i = 0; i < nevents; i++) {
-        ev = event_index[i];
-        c = ev->data;
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "select event: fd:%d wr:%d", c->fd,ev->write);
-    }
-#endif
+    expire = 1;
 
 #if !(WIN32)
 
+    if (ngx_accept_mutex) {
+        if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
+            return NGX_ERROR;
+        }
+
+        if (ngx_accept_mutex_held == 0
+            && (timer == 0 || timer > ngx_accept_mutex_delay))
+        {
+            timer = ngx_accept_mutex_delay;
+            expire = 0;
+        }
+    }
+
     if (max_fd == -1) {
         for (i = 0; i < nevents; i++) {
             c = event_index[i]->data;
@@ -303,22 +295,41 @@
                        "change max_fd: %d", max_fd);
     }
 
-    if (ngx_accept_mutex) {
-        if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
-            return NGX_ERROR;
-        }
-
-        if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) {
-            timer = ngx_accept_mutex_delay;
-            expire = 0;
-        }
-    }
-
 #endif
 
+#if (NGX_DEBUG)
+    for (i = 0; i < nevents; i++) {
+        ev = event_index[i];
+        c = ev->data;
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                       "select event: fd:%d wr:%d", c->fd, ev->write);
+    }
+#endif
+
+    if (timer == -1) {
+        tv.tv_sec = 0;
+        tv.tv_usec = 0;
+        tp = &tv;
+
+    } else if (timer) {
+        tv.tv_sec = timer / 1000;
+        tv.tv_usec = (timer % 1000) * 1000;
+        tp = &tv;
+
+    } else {
+        tp = NULL;
+        expire = 0;
+    }
+
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                    "select timer: %d", timer);
 
+    work_read_fd_set = master_read_fd_set;
+    work_write_fd_set = master_write_fd_set;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                   "select read fd_set: %08X", *(int *) &work_read_fd_set);
+
 #if (WIN32)
     ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp);
 #else
@@ -359,6 +370,7 @@
         if (ready == 0) {
             ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
                           "select() returned no events without timeout");
+            ngx_accept_mutex_unlock();
             return NGX_ERROR;
         }
     }
@@ -381,6 +393,7 @@
         if (ready == 0) {
             ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
                           "select() returned no events without timeout");
+            ngx_accept_mutex_unlock();
             return NGX_ERROR;
         }
     }
@@ -397,6 +410,7 @@
         ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
                       cycle->log, err, "select() failed");
 #endif
+        ngx_accept_mutex_unlock();
         return NGX_ERROR;
     }