diff src/event/modules/ngx_devpoll_module.c @ 323:ba876b26b76d

nginx-0.0.3-2004-04-21-22:54:33 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 21 Apr 2004 18:54:33 +0000
parents 56496082668b
children 7c54d93f5965
line wrap: on
line diff
--- a/src/event/modules/ngx_devpoll_module.c
+++ b/src/event/modules/ngx_devpoll_module.c
@@ -313,7 +313,7 @@ int ngx_devpoll_process_events(ngx_cycle
 {
     int                 events;
     ngx_int_t           i;
-    ngx_uint_t          j, lock, expire;
+    ngx_uint_t          j, lock, accept_lock, expire;
     size_t              n;
     ngx_msec_t          timer;
     ngx_err_t           err;
@@ -346,21 +346,30 @@ int ngx_devpoll_process_events(ngx_cycle
         expire = 1;
     }
 
+    ngx_old_elapsed_msec = ngx_elapsed_msec;
+    accept_lock = 0;
+
     if (ngx_accept_mutex) {
-        if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
-            return NGX_ERROR;
-        }
+        if (ngx_accept_disabled > 0) {
+            ngx_accept_disabled--;
 
-        if (ngx_accept_mutex_held == 0
-            && (timer == NGX_TIMER_INFINITE || timer > ngx_accept_mutex_delay))
-        {
-            timer = ngx_accept_mutex_delay;
-            expire = 0;
+        } else {
+            if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
+                return NGX_ERROR;
+            } 
+
+            if (ngx_accept_mutex_held) {
+                accept_lock = 1;
+
+            } else if (timer == NGX_TIMER_INFINITE
+                       || timer > ngx_accept_mutex_delay)
+            {
+                timer = ngx_accept_mutex_delay;
+                expire = 0;
+            }
         }
     }
 
-    ngx_old_elapsed_msec = ngx_elapsed_msec;
-
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                    "devpoll timer: %d", timer);
 
@@ -493,30 +502,39 @@ int ngx_devpoll_process_events(ngx_cycle
             } else if (!c->read->accept) {
                 ngx_post_event(c->read);
 
-            } else {
+            } else if (ngx_accept_disabled <= 0) {
                 ngx_mutex_unlock(ngx_posted_events_mutex);
 
                 c->read->event_handler(c->read);
 
+                if (ngx_accept_disabled > 0) { 
+                    ngx_accept_mutex_unlock();
+                    accept_lock = 0;
+                }
+
                 if (i + 1 == events) {
                     lock = 0;
                     break;
                 }
 
                 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
-                    ngx_accept_mutex_unlock();
+                    if (accept_lock) {
+                        ngx_accept_mutex_unlock();
+                    }
                     return NGX_ERROR;
                 }
             }
         }
     }
 
+    if (accept_lock) {
+        ngx_accept_mutex_unlock();
+    }
+
     if (lock) {
         ngx_mutex_unlock(ngx_posted_events_mutex);
     }
 
-    ngx_accept_mutex_unlock();
-
     if (expire && delta) {
         ngx_event_expire_timers((ngx_msec_t) delta);
     }