nginx-0.3.5-RELEASE import

    *) Bugfix: the segmentation fault may occurred if the IMAP/POP3 login
       was changed by authorization server; the bug had appeared in 0.2.2.

    *) Bugfix: the accept mutex did not work and all connections were
       handled by one process; the bug had appeared in 0.3.3.

    *) Bugfix: the timeout did not work if the "rtsig" method and the
       "timer_resolution" directive were used.
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c
index 54a5956..7238e5b 100644
--- a/src/event/modules/ngx_devpoll_module.c
+++ b/src/event/modules/ngx_devpoll_module.c
@@ -332,7 +332,6 @@
     ngx_err_t           err;
     ngx_int_t           i;
     ngx_uint_t          level;
-    ngx_msec_t          delta;
     ngx_event_t        *rev, *wev, **queue;
     ngx_connection_t   *c;
     struct dvpoll       dvp;
@@ -349,6 +348,8 @@
                           "write(/dev/poll) failed");
             return NGX_ERROR;
         }
+
+        nchanges = 0;
     }
 
     dvp.dp_fds = event_list;
@@ -362,10 +363,6 @@
         err = 0;
     }
 
-    nchanges = 0;
-
-    delta = ngx_current_msec;
-    
     if (flags & NGX_UPDATE_TIME) {
         ngx_time_update(0, 0);
     }
@@ -388,21 +385,14 @@
         return NGX_ERROR;
     }
 
-    if (timer != NGX_TIMER_INFINITE) {
-        delta = ngx_current_msec - delta;
-
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "devpoll timer: %M, delta: %M", timer, delta);
-    } else {
-        if (events == 0) {
-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                          "ioctl(DP_POLL) returned no events without timeout");
-            return NGX_ERROR;
-        }
-    }
-
     if (events == 0) {
-        return NGX_OK;
+        if (timer != NGX_TIMER_INFINITE) {
+            return NGX_OK;
+        }
+
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                      "ioctl(DP_POLL) returned no events without timeout");
+        return NGX_ERROR;
     }
 
     ngx_mutex_lock(ngx_posted_events_mutex);
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c
index 14013dc..7364d7d 100644
--- a/src/event/modules/ngx_epoll_module.c
+++ b/src/event/modules/ngx_epoll_module.c
@@ -391,7 +391,6 @@
     ngx_uint_t         level;
     ngx_err_t          err;
     ngx_log_t         *log;
-    ngx_msec_t         delta;
     ngx_event_t       *rev, *wev, **queue;
     ngx_connection_t  *c;
 
@@ -408,25 +407,10 @@
         err = 0;
     }
 
-    delta = ngx_current_msec;
-    
     if (flags & NGX_UPDATE_TIME) {
         ngx_time_update(0, 0);
     }
 
-    if (timer != NGX_TIMER_INFINITE) {
-        delta = ngx_current_msec - delta;
-
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "epoll timer: %M, delta: %M", timer, delta);
-    } else {
-        if (events == 0) {
-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                          "epoll_wait() returned no events without timeout");
-            return NGX_ERROR;
-        }
-    }
-
     if (err) {
         if (err == NGX_EINTR) {
 
@@ -446,7 +430,13 @@
     }
 
     if (events == 0) {
-        return NGX_OK;
+        if (timer != NGX_TIMER_INFINITE) {
+            return NGX_OK;
+        }
+
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                      "epoll_wait() returned no events without timeout");
+        return NGX_ERROR;
     }
 
     ngx_mutex_lock(ngx_posted_events_mutex);
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index d491679..839afb5 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -473,7 +473,6 @@
     ngx_int_t         i, instance;
     ngx_uint_t        level;
     ngx_err_t         err;
-    ngx_msec_t        delta;
     ngx_event_t      *ev, **queue;
     struct timespec   ts, *tp;
 
@@ -509,8 +508,6 @@
         err = 0;
     }
 
-    delta = ngx_current_msec;
-
     if (flags & NGX_UPDATE_TIME) {
         ngx_time_update(0, 0);
     }
@@ -536,22 +533,14 @@
         return NGX_ERROR;
     }
 
-    if (timer != NGX_TIMER_INFINITE) {
-        delta = ngx_current_msec - delta;
-
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "kevent timer: %M, delta: %M", timer, delta);
-
-    } else {
-        if (events == 0) {
-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                          "kevent() returned no events without timeout");
-            return NGX_ERROR;
-        }
-    }
-
     if (events == 0) {
-        return NGX_OK;
+        if (timer != NGX_TIMER_INFINITE) {
+            return NGX_OK;
+        }
+
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                      "kevent() returned no events without timeout");
+        return NGX_ERROR;
     }
 
     ngx_mutex_lock(ngx_posted_events_mutex);
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index 61d6179..ffd6ace 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -241,7 +241,6 @@
     ngx_err_t           err;
     ngx_int_t           i, nready;
     ngx_uint_t          found, level;
-    ngx_msec_t          delta;
     ngx_event_t        *ev, **queue;
     ngx_connection_t   *c;
 
@@ -267,8 +266,6 @@
         err = 0;
     }
 
-    delta = ngx_current_msec;
-
     if (flags & NGX_UPDATE_TIME) {
         ngx_time_update(0, 0);
     }
@@ -294,21 +291,14 @@
         return NGX_ERROR;
     }
 
-    if (timer != NGX_TIMER_INFINITE) {
-        delta = ngx_current_msec - delta;
-
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "poll timer: %M, delta: %M", timer, delta);
-    } else {
-        if (ready == 0) {
-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                          "poll() returned no events without timeout");
-            return NGX_ERROR;
-        }
-    }
-
     if (ready == 0) {
-        return NGX_OK;
+        if (timer != NGX_TIMER_INFINITE) {
+            return NGX_OK;
+        }
+
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                      "poll() returned no events without timeout");
+        return NGX_ERROR;
     }
 
     ngx_mutex_lock(ngx_posted_events_mutex);
diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c
index 450943c..e57a5dd 100644
--- a/src/event/modules/ngx_rtsig_module.c
+++ b/src/event/modules/ngx_rtsig_module.c
@@ -286,7 +286,6 @@
 {
     int                 signo;
     ngx_int_t           instance;
-    ngx_msec_t          delta;
     ngx_err_t           err;
     siginfo_t           si;
     ngx_event_t        *rev, *wev;
@@ -317,41 +316,34 @@
         ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err,
                        "rtsig signo:%d", signo);
 
-        if (err == NGX_EAGAIN) {
-
-            if (timer == NGX_TIMER_INFINITE) {
-                ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
-                              "sigtimedwait() returned EAGAIN without timeout");
-                return NGX_ERROR;
-            }
-
-            err = 0;
+        if (flags & NGX_UPDATE_TIME) {
+            ngx_time_update(0, 0);
         }
 
-    } else {
-        err = 0;
-        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "rtsig signo:%d fd:%d band:%04Xd",
-                       signo, si.si_fd, si.si_band);
-    }
+        if (err == NGX_EAGAIN) {
 
-    delta = ngx_current_msec;
-    
-    if (flags & NGX_UPDATE_TIME) {
-        ngx_time_update(0, 0);
-    }
+            /* timeout */
 
-    if (err) {
+            if (timer != NGX_TIMER_INFINITE) {
+                return NGX_AGAIN;
+            }
+                
+            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
+                          "sigtimedwait() returned EAGAIN without timeout");
+            return NGX_ERROR;
+        }
+
         ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
                       cycle->log, err, "sigtimedwait() failed");
         return NGX_ERROR;
     }
 
-    if (timer != NGX_TIMER_INFINITE) {
-        delta = ngx_current_msec - delta;
+    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                   "rtsig signo:%d fd:%d band:%04Xd",
+                   signo, si.si_fd, si.si_band);
 
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "rtsig timer: %M, delta: %M", timer, delta);
+    if (flags & NGX_UPDATE_TIME) {
+        ngx_time_update(0, 0);
     }
 
     rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module);
@@ -400,8 +392,12 @@
             wev->handler(wev);
         }
 
+        return NGX_OK;
+
     } else if (signo == SIGALRM) {
 
+        ngx_time_update(0, 0);
+
         return NGX_OK;
 
     } else if (signo == SIGIO) {
@@ -431,18 +427,12 @@
 
         return NGX_ERROR;
 
-    } else if (signo != -1) {
-        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                      "sigtimedwait() returned unexpected signal: %d", signo);
-
-        return NGX_ERROR;
     }
 
-    if (signo != -1) {
-        return NGX_OK;
-    }
+    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                  "sigtimedwait() returned unexpected signal: %d", signo);
 
-    return NGX_AGAIN;
+    return NGX_ERROR;
 }
 
 
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index da4303d..57f6f05 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -250,7 +250,6 @@
     int                 ready, nready;
     ngx_uint_t          i, found;
     ngx_err_t           err;
-    ngx_msec_t          delta;
     ngx_event_t        *ev, **queue;
     ngx_connection_t   *c;
     struct timeval      tv, *tp;
@@ -331,26 +330,10 @@
         err = 0;
     }
 
-    delta = ngx_current_msec;
-
     if (flags & NGX_UPDATE_TIME) {
         ngx_time_update(0, 0);
     }
 
-    if (timer != NGX_TIMER_INFINITE) {
-        delta = ngx_current_msec - delta;
-
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                       "select timer: %M, delta: %M", timer, delta);
-
-    } else {
-        if (ready == 0) {
-            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
-                          "select() returned no events without timeout");
-            return NGX_ERROR;
-        }
-    }
-
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                    "select ready %d", ready);
 
@@ -383,8 +366,14 @@
 
 #endif
 
-    if (nevents == 0) {
-        return NGX_OK;
+    if (ready == 0) {
+        if (timer != NGX_TIMER_INFINITE) {
+            return NGX_OK;
+        }
+
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                      "select() returned no events without timeout");
+        return NGX_ERROR;
     }
 
     ngx_mutex_lock(ngx_posted_events_mutex);
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index 6dc6e3c..4775e5d 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -199,7 +199,7 @@
 ngx_process_events_and_timers(ngx_cycle_t *cycle)
 {
     ngx_uint_t  flags;
-    ngx_msec_t  timer;
+    ngx_msec_t  timer, delta;
 
     if (ngx_timer_resolution) {
         timer = NGX_TIMER_INFINITE;
@@ -240,16 +240,25 @@
         }
     }
 
+    delta = ngx_current_msec;
+
     (void) ngx_process_events(cycle, timer, flags);
 
-    ngx_event_expire_timers();
+    delta = ngx_current_msec - delta;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                   "timer delta: %M", delta);
+
+    if (delta) {
+        ngx_event_expire_timers();
+    }
 
     if (ngx_posted_accept_events) {
         ngx_event_process_posted(cycle, &ngx_posted_accept_events);
     }
 
     if (ngx_accept_mutex_held) {
-        ngx_accept_mutex = 0;
+        *ngx_accept_mutex = 0;
     }
 
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,