diff src/event/modules/ngx_select_module.c @ 315:39b6f2df45c0

nginx-0.0.3-2004-04-14-21:44:28 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 14 Apr 2004 17:44:28 +0000
parents d71c87d11b16
children a0beefedaf94
line wrap: on
line diff
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -263,34 +263,26 @@ static int ngx_select_process_events(ngx
     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 @@ static int ngx_select_process_events(ngx
                        "change max_fd: %d", max_fd);
     }
 
-    if (ngx_accept_mutex) {
-        if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
-            return NGX_ERROR;
-        }
+#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 (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) {
-            timer = ngx_accept_mutex_delay;
-            expire = 0;
-        }
+    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;
     }
 
-#endif
-
     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 @@ static int ngx_select_process_events(ngx
         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 @@ static int ngx_select_process_events(ngx
         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 @@ static int ngx_select_process_events(ngx
         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;
     }