diff src/event/ngx_event_posted.c @ 370:54f76b0b8dca

nginx-0.0.7-2004-06-27-22:01:57 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 27 Jun 2004 18:01:57 +0000
parents 7b96b7f8a6af
children 780e93985b93
line wrap: on
line diff
--- a/src/event/ngx_event_posted.c
+++ b/src/event/ngx_event_posted.c
@@ -5,8 +5,10 @@
 
 
 ngx_thread_volatile ngx_event_t  *ngx_posted_events;
+
 #if (NGX_THREADS)
 ngx_mutex_t                      *ngx_posted_events_mutex;
+ngx_cv_t                         *ngx_posted_events_cv;
 #endif
 
 
@@ -55,26 +57,70 @@ void ngx_event_process_posted(ngx_cycle_
 
 #if (NGX_THREADS)
 
-void ngx_event_thread_handler(ngx_event_t *ev)
+ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle)
 {
-    if ((!ev->posted && !ev->active)
-        || (ev->use_instance && ev->instance != ev->returned_instance))
-    {
-        /*
-         * the stale event from a file descriptor
-         * that was just closed in this iteration
-         */
+    ngx_event_t  *ev, **ep;
+
+    for ( ;; ) {
+
+        ev = (ngx_event_t *) ngx_posted_events;
+        ep = (ngx_event_t **) &ngx_posted_events;
+
+        for ( ;; ) {
+
+            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                          "posted event " PTR_FMT, ev);
+
+            if (ev == NULL) {
+                ngx_mutex_unlock(ngx_posted_events_mutex);
+                return NGX_OK;
+            }
+
+            if (ngx_trylock(ev->lock) == NGX_BUSY) {
+
+                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                               "posted event " PTR_FMT " is busy", ev);
+
+                ep = &ev->next;
+                ev = ev->next;
+                continue;
+            }
+
+            *ep = ev->next;
 
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,
-                       "kevent: stale event " PTR_FMT, ev);
-        return;
-    }
+            if ((!ev->posted && !ev->active)
+                || (ev->use_instance && ev->instance != ev->returned_instance))
+            {
+                /*
+                 * the stale event from a file descriptor
+                 * that was just closed in this iteration
+                 */
+
+                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,
+                               "kevent: stale event " PTR_FMT, ev);
+
+                ev = ev->next;
+
+                continue;
+            }
 
-    if (ev->posted) {
-        ev->posted = 0;
+            ngx_mutex_unlock(ngx_posted_events_mutex);
+
+            if (ev->posted) {
+                ev->posted = 0;
+            }
+
+            ev->event_handler(ev);
+
+            *(ev->lock) = 0;
+
+            if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
+                return NGX_ERROR;
+            }
+
+            break;
+        }
     }
-
-    ev->event_handler(ev);
 }
 
 #endif