]> git.kaiwu.me - nginx.git/commitdiff
nginx-0.0.2-2004-02-26-20:10:01 import
authorIgor Sysoev <igor@sysoev.ru>
Thu, 26 Feb 2004 17:10:01 +0000 (17:10 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Thu, 26 Feb 2004 17:10:01 +0000 (17:10 +0000)
src/core/ngx_times.c
src/event/modules/ngx_kqueue_module.c
src/event/ngx_event.c
src/event/ngx_event.h
src/os/unix/ngx_freebsd_rfork_thread.c
src/os/unix/ngx_thread.h

index 235e7032d47c8479990df53cf2ff14568bee37ff..a9ddb82dc812b64597016d1a2df4ff20784ecfeb 100644 (file)
@@ -77,10 +77,8 @@ void ngx_time_update(time_t s)
     }
 
 #if (NGX_THREADS)
-    if (ngx_time_mutex) {
-        if (ngx_mutex_trylock(ngx_time_mutex) != NGX_OK) {
-            return;
-        }
+    if (ngx_mutex_trylock(ngx_time_mutex) != NGX_OK) {
+        return;
     }
 #endif
 
@@ -119,9 +117,7 @@ void ngx_time_update(time_t s)
                                        tm.ngx_tm_sec);
 
 #if (NGX_THREADS)
-    if (ngx_time_mutex) {
-        ngx_mutex_unlock(ngx_time_mutex);
-    }
+    ngx_mutex_unlock(ngx_time_mutex);
 #endif
 
 }
index e89eb9953802e4aa4d5a926c568c07366126e761..bfdd98bb20f68d782119c53178d439889e5f1b44 100644 (file)
@@ -413,6 +413,12 @@ static ngx_int_t ngx_kqueue_process_events(ngx_log_t *log)
         }
     }
 
+#if (NGX_THREADS0)
+    if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
+        return NGX_ERROR;
+    }
+#endif
+
     for (i = 0; i < events; i++) {
 
         ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0,
@@ -468,41 +474,109 @@ static ngx_int_t ngx_kqueue_process_events(ngx_log_t *log)
 
             ev->ready = 1;
 
-            ev->event_handler(ev);
-
             break;
 
         case EVFILT_VNODE:
             ev->kq_vnode = 1;
 
-            ev->event_handler(ev);
-
             break;
 
         case EVFILT_AIO:
             ev->complete = 1;
             ev->ready = 1;
 
-            ev->event_handler(ev);
-
             break;
 
-
         default:
             ngx_log_error(NGX_LOG_ALERT, log, 0,
                           "unexpected kevent() filter %d",
                           event_list[i].filter);
+            continue;
+        }
+
+#if (NGX_THREADS0)
+
+        if (ngx_threaded) {
+
+            if (ev->light) {
+
+                /* the accept event */
+
+                ngx_mutex_unlock(ngx_posted_events_mutex);
+
+                ev->event_handler(ev);
+
+                if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
+                    return NGX_ERROR;
+                }
+
+            } else {
+                ev->next = ngx_posted_events;
+                ngx_posted_events = ev;
+            }
+
+            continue;
         }
+
+#endif
+
+        ev->event_handler(ev);
     }
 
+#if (NGX_THREADS0)
+    ngx_mutex_unlock(ngx_posted_events_mutex);
+#endif
+
     if (timer && delta) {
         ngx_event_expire_timers((ngx_msec_t) delta);
     }
 
+#if (NGX_THREADS0)
+    if (!ngx_threaded) {
+    }
+#endif
+
+    /* TODO: non-thread mode only */
+
+    ev = ngx_posted_events;
+    ngx_posted_events = NULL;
+
+    while (ev) {
+        ev->event_handler(ev);
+        ev = ev->next;
+    }
+
     return NGX_OK;
 }
 
 
+#if (NGX_THREADS)
+
+static void ngx_kqueue_thread_handler(ngx_event_t *ev)
+{
+    ngx_int_t  instance;
+
+    instance = (uintptr_t) ev & 1;
+    ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);
+
+    if (ev->active == 0 || ev->instance != 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);
+        return;
+    }
+
+    ev->event_handler(ev);
+}
+
+#endif
+
+
 static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle)
 {
     ngx_kqueue_conf_t  *kcf;
index 80c65dce44835616777342e801c66e50a263c93d..820a5f51b331ed3ad0407c83444c9192ce9aa0d3 100644 (file)
@@ -45,6 +45,7 @@ ngx_event_actions_t  ngx_event_actions;
 
 static int           ngx_event_max_module;
 
+ngx_event_t         *ngx_posted_events;
 
 
 static ngx_str_t  events_name = ngx_string("events");
index 83ce81436f4c1471b37177193cfb3b1e970449a4..899db18aaaca59da43676a5ee443a44a5313f414 100644 (file)
@@ -27,8 +27,7 @@ struct ngx_event_s {
 
     u_int            index;
 
-    /* queue in mutex(), aio_read(), aio_write()  */
-    ngx_event_t     *prev;
+    /* the link of the posted queue or the event mutecies queues */
     ngx_event_t     *next;
 
     ngx_log_t       *log;
@@ -374,6 +373,8 @@ typedef struct {
 
 
 
+extern ngx_event_t          *ngx_posted_events;
+
 extern int                   ngx_event_flags;
 extern ngx_module_t          ngx_events_module;
 extern ngx_module_t          ngx_event_core_module;
index 4ea8b4c6c50b180faa0dd519fef62558b796f0a8..dd18168a23aecb388fa8de0d1058502bdad4ae0a 100644 (file)
@@ -21,6 +21,8 @@
  */
 
 
+ngx_int_t  ngx_threaded;
+
 static inline int ngx_gettid();
 
 
@@ -204,6 +206,8 @@ ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle)
     /* allow the spinlock in libc malloc() */
     __isthreaded = 1;
 
+    ngx_threaded = 1;
+
     return NGX_OK;
 }
 
@@ -315,6 +319,10 @@ ngx_int_t ngx_mutex_do_lock(ngx_mutex_t *m, ngx_int_t try)
     ngx_uint_t     tries;
     struct sembuf  op;
 
+    if (!ngx_threaded) {
+        return NGX_OK;
+    }
+
 #if (NGX_DEBUG)
     if (try) {
         ngx_log_debug2(NGX_LOG_DEBUG_CORE, m->log, 0,
@@ -438,6 +446,10 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m)
     uint32_t       lock, new, old;
     struct sembuf  op;
 
+    if (!ngx_threaded) {
+        return NGX_OK;
+    }
+
     old = m->lock;
 
     if (!(old & NGX_MUTEX_LOCK_BUSY)) {
index 3ecc1e62af84cafeb4e9d4bddd1c47a916827135..3961f328fa3e55d93cbe455a7436005ce18d74f0 100644 (file)
@@ -60,6 +60,9 @@ ngx_int_t ngx_mutex_do_lock(ngx_mutex_t *m, ngx_int_t try);
 ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m);
 
 
+extern ngx_int_t ngx_threaded;
+
+
 #else /* !NGX_THREADS */
 
 #define ngx_log_tid  0