changeset 302:1526e7686b20

nginx-0.0.3-2004-04-01-10:21:13 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 01 Apr 2004 06:21:13 +0000
parents 744965ec6275
children 00c5660d2707
files auto/cc auto/configure src/core/ngx_atomic.h src/event/modules/ngx_iocp_module.c src/event/modules/ngx_kqueue_module.c src/event/modules/ngx_select_module.c src/event/ngx_event.h src/event/ngx_event_accept.c src/os/unix/ngx_process_cycle.c src/os/win32/ngx_process_cycle.c src/os/win32/ngx_win32_config.h
diffstat 11 files changed, 76 insertions(+), 67 deletions(-) [+]
line wrap: on
line diff
--- a/auto/cc
+++ b/auto/cc
@@ -24,6 +24,9 @@ case $CC in
              ;;
          esac
 
+         # STUB for batch builds
+         if [ $CC = gcc27 ]; then CPU_OPT=; fi
+
          CFLAGS="$CFLAGS $PIPE $CPU_OPT"
 
          if [ ".$PCRE_OPT" = "." ]; then
--- a/auto/configure
+++ b/auto/configure
@@ -36,6 +36,6 @@ if [ "$PLATFORM" != win32 ]; then
     . auto/unix
 fi
 
-#have NGX_SMP . auto/have
+have NGX_SMP . auto/have
 
 . auto/summary
--- a/src/core/ngx_atomic.h
+++ b/src/core/ngx_atomic.h
@@ -70,10 +70,14 @@ static ngx_inline uint32_t ngx_atomic_cm
 
 #elif (WIN32)
 
-#define ngx_atomic_inc(x)                    InterlockedIncrement
-#define ngx_atomic_dec(x)                    InterlockedDecrement
+#define ngx_atomic_inc(p)       InterlockedIncrement((long *) p)
+#define ngx_atomic_dec(p)       InterlockedDecrement((long *) p)
+/* STUB */
+#define ngx_atomic_cmp_set(lock, old, set)   1
+#if 0
 #define ngx_atomic_cmp_set(lock, old, set)                                   \
                                   InterlockedCompareExchange(lock, set, old)
+#endif
 
 
 #else
@@ -83,7 +87,7 @@ typedef volatile uint32_t  ngx_atomic_t;
 /* STUB */
 #define ngx_atomic_inc(x)   (*(x))++;
 #define ngx_atomic_dec(x)   (*(x))--;
-#define ngx_atomic_cmp_set(lock, old, set)   1;
+#define ngx_atomic_cmp_set(lock, old, set)   1
 /**/
 
 #endif
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -14,7 +14,7 @@ static ngx_int_t ngx_iocp_init(ngx_cycle
 static void ngx_iocp_done(ngx_cycle_t *cycle);
 static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key);
 static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags);
-static ngx_int_t ngx_iocp_process_events(ngx_log_t *log);
+static ngx_int_t ngx_iocp_process_events(ngx_cycle_t *cycle);
 static void *ngx_iocp_create_conf(ngx_cycle_t *cycle);
 static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf);
 
@@ -160,7 +160,7 @@ static ngx_int_t ngx_iocp_del_connection
 }
 
 
-static ngx_int_t ngx_iocp_process_events(ngx_log_t *log)
+static ngx_int_t ngx_iocp_process_events(ngx_cycle_t *cycle)
 {
     int                rc;
     u_int              key;
@@ -179,7 +179,7 @@ static ngx_int_t ngx_iocp_process_events
         timer = INFINITE;
     }
 
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "iocp timer: %d", timer);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "iocp timer: %d", timer);
 
     rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &key,
                                    (LPOVERLAPPED *) &ovlp, timer);
@@ -193,7 +193,7 @@ static ngx_int_t ngx_iocp_process_events
     ngx_gettimeofday(&tv);
     ngx_time_update(tv.tv_sec);
 
-    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,
+    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                    "iocp: %d b:%d k:%d ov:" PTR_FMT, rc, bytes, key, ovlp);
 
     delta = ngx_elapsed_msec;
@@ -202,7 +202,7 @@ static ngx_int_t ngx_iocp_process_events
     if (err) {
         if (ovlp == NULL) {
             if (err != WAIT_TIMEOUT) {
-                ngx_log_error(NGX_LOG_ALERT, log, err,
+                ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
                               "GetQueuedCompletionStatus() failed");
 
                 return NGX_ERROR;
@@ -216,14 +216,15 @@ static ngx_int_t ngx_iocp_process_events
     if (timer != INFINITE) {
         delta = ngx_elapsed_msec - delta;
 
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "iocp timer: %d, delta: %d", timer, (int) delta);
     }
 
     if (ovlp) {
         ev = ovlp->event;
 
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "iocp event:" PTR_FMT, ev);
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                       "iocp event:" PTR_FMT, ev);
 
         switch (key) {
 
@@ -244,7 +245,7 @@ static ngx_int_t ngx_iocp_process_events
 
         ev->available = bytes;
 
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "iocp event handler: " PTR_FMT, ev->event_handler);
 
         ev->event_handler(ev);
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -375,8 +375,8 @@ static ngx_int_t ngx_kqueue_process_even
             return NGX_ERROR;
         }
 
-#if 1
-        if (ngx_accept_token == 0 && timer == 0) {
+#if 0
+        if (ngx_accept_mutex_held == 0 && timer == 0) {
             /* STUB */ timer = 500;
         }
 #endif
@@ -416,11 +416,7 @@ static ngx_int_t ngx_kqueue_process_even
     if (err) {
         ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
                       cycle->log, err, "kevent() failed");
-
-        if (ngx_accept_token) {
-            *ngx_accept_mutex = 0;
-        }
-
+        ngx_accept_mutex_unlock();
         return NGX_ERROR;
     }
 
@@ -434,21 +430,13 @@ static ngx_int_t ngx_kqueue_process_even
         if (events == 0) {
             ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
                           "kevent() returned no events without timeout");
-
-            if (ngx_accept_token) {
-                *ngx_accept_mutex = 0;
-            }
-
+            ngx_accept_mutex_unlock();
             return NGX_ERROR;
         }
     }
 
     if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
-
-        if (ngx_accept_token) {
-            *ngx_accept_mutex = 0;
-        }
-
+        ngx_accept_mutex_unlock();
         return NGX_ERROR;
     }
 
@@ -532,7 +520,7 @@ static ngx_int_t ngx_kqueue_process_even
 #if 0
         if (ngx_threaded || ngx_accept_token) {
 #endif
-        if (ngx_accept_token) {
+        if (ngx_accept_mutex_held) {
 
             if (ev->accept) {
                 ngx_mutex_unlock(ngx_posted_events_mutex);
@@ -540,11 +528,7 @@ static ngx_int_t ngx_kqueue_process_even
                 ev->event_handler(ev);
 
                 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
-
-                    if (ngx_accept_token) {
-                        *ngx_accept_mutex = 0;
-                    }
-
+                    ngx_accept_mutex_unlock();
                     return NGX_ERROR;
                 }
 
@@ -561,9 +545,7 @@ static ngx_int_t ngx_kqueue_process_even
 
     ngx_mutex_unlock(ngx_posted_events_mutex);
 
-    if (ngx_accept_token) {
-        *ngx_accept_mutex = 0;
-    }
+    ngx_accept_mutex_unlock();
 
     if (timer && delta) {
         ngx_event_expire_timers((ngx_msec_t) delta);
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -13,7 +13,7 @@ static int ngx_select_init(ngx_cycle_t *
 static void ngx_select_done(ngx_cycle_t *cycle);
 static int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags);
 static int ngx_select_del_event(ngx_event_t *ev, int event, u_int flags);
-static int ngx_select_process_events(ngx_log_t *log);
+static int ngx_select_process_events(ngx_cycle_t *cycle);
 
 static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf);
 
@@ -237,7 +237,7 @@ static int ngx_select_del_event(ngx_even
 }
 
 
-static int ngx_select_process_events(ngx_log_t *log)
+static int ngx_select_process_events(ngx_cycle_t *cycle)
 {
     int                i, ready, nready,found;
     ngx_err_t          err;
@@ -274,7 +274,7 @@ static int ngx_select_process_events(ngx
             }
         }
 
-        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "change max_fd: %d", max_fd);
     }
 #endif
@@ -283,12 +283,13 @@ static int ngx_select_process_events(ngx
     for (i = 0; i < nevents; i++) {
         ev = event_index[i];
         c = ev->data;
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "select event: fd:%d wr:%d", c->fd,ev->write);
     }
 #endif
 
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "select timer: %d", timer);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                   "select timer: %d", timer);
 
 #if (WIN32)
     ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp);
@@ -319,7 +320,7 @@ static int ngx_select_process_events(ngx
             deltas = tv.tv_usec / 1000;
         }
 
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "select timer: %d, delta: %d", timer, (int) delta);
 
     } else {
@@ -328,7 +329,7 @@ static int ngx_select_process_events(ngx
         ngx_time_update(tv.tv_sec);
 
         if (ready == 0) {
-            ngx_log_error(NGX_LOG_ALERT, log, 0,
+            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
                           "select() returned no events without timeout");
             return NGX_ERROR;
         }
@@ -345,12 +346,12 @@ static int ngx_select_process_events(ngx
     if (timer) {
         delta = ngx_elapsed_msec - delta;
 
-        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "select timer: %d, delta: %d", timer, (int) delta);
 
     } else {
         if (ready == 0) {
-            ngx_log_error(NGX_LOG_ALERT, log, 0,
+            ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
                           "select() returned no events without timeout");
             return NGX_ERROR;
         }
@@ -358,14 +359,15 @@ static int ngx_select_process_events(ngx
 
 #endif /* HAVE_SELECT_CHANGE_TIMEOUT */
 
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "select ready %d", ready);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                   "select ready %d", ready);
 
     if (err) {
 #if (WIN32)
-        ngx_log_error(NGX_LOG_ALERT, log, err, "select() failed");
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "select() failed");
 #else
         ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
-                      log, err, "select() failed");
+                      cycle->log, err, "select() failed");
 #endif
         return NGX_ERROR;
     }
@@ -380,14 +382,14 @@ static int ngx_select_process_events(ngx
         if (ev->write) {
             if (FD_ISSET(c->fd, &work_write_fd_set)) {
                 found = 1;
-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
+                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                                "select write %d", c->fd);
             }
 
         } else {
             if (FD_ISSET(c->fd, &work_read_fd_set)) {
                 found = 1;
-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
+                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                                "select read %d", c->fd);
             }
         }
@@ -423,7 +425,7 @@ static int ngx_select_process_events(ngx
     }
 
     if (ready != 0) {
-        ngx_log_error(NGX_LOG_ALERT, log, 0, "select ready != events");
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "select ready != events");
     }
 
     if (timer && delta) {
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -396,8 +396,15 @@ extern ngx_thread_volatile ngx_event_t  
 #if (NGX_THREADS)
 extern ngx_mutex_t           *ngx_posted_events_mutex;
 #endif
+
+extern ngx_atomic_t          *ngx_accept_mutex_ptr;
 extern ngx_atomic_t          *ngx_accept_mutex;
-extern ngx_uint_t             ngx_accept_token;
+extern ngx_uint_t             ngx_accept_mutex_held;
+
+#define ngx_accept_mutex_unlock()                                             \
+           if (ngx_accept_mutex_held) {                                       \
+               *ngx_accept_mutex = 0;                                         \
+           }
 
 
 extern int                    ngx_event_flags;
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -14,8 +14,9 @@ typedef struct {
 static size_t ngx_accept_log_error(void *data, char *buf, size_t len);
 
 
+ngx_atomic_t  *ngx_accept_mutex_ptr;
 ngx_atomic_t  *ngx_accept_mutex;
-ngx_uint_t     ngx_accept_token;
+ngx_uint_t     ngx_accept_mutex_held;
 
 
 void ngx_event_accept(ngx_event_t *ev)
@@ -311,23 +312,24 @@ ngx_int_t ngx_trylock_accept_mutex(ngx_c
         ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                        "accept mutex locked");
 
-        if (!ngx_accept_token) {
+        if (!ngx_accept_mutex_held) {
             if (ngx_enable_accept_events(cycle) == NGX_ERROR) {
+                *ngx_accept_mutex = 0;
                 return NGX_ERROR;
             }
 
-            ngx_accept_token = 1;
+            ngx_accept_mutex_held = 1;
         }
 
         return NGX_OK;
     }
 
-    if (ngx_accept_token) {
+    if (ngx_accept_mutex_held) {
         if (ngx_disable_accept_events(cycle) == NGX_ERROR) {
             return NGX_ERROR;
         }
 
-        ngx_accept_token = 0;
+        ngx_accept_mutex_held = 0;
     }
 
     return NGX_OK;
--- a/src/os/unix/ngx_process_cycle.c
+++ b/src/os/unix/ngx_process_cycle.c
@@ -65,10 +65,11 @@ void ngx_master_process_cycle(ngx_cycle_
     signo = 0;
     live = 0;
 
-    ngx_accept_mutex = mmap(NULL, sizeof(ngx_atomic_t), PROT_READ|PROT_WRITE,
-                            MAP_ANON|MAP_SHARED, -1, 0);
+    ngx_accept_mutex_ptr = mmap(NULL, sizeof(ngx_atomic_t),
+                                PROT_READ|PROT_WRITE,
+                                MAP_ANON|MAP_SHARED, -1, 0);
 
-    if (ngx_accept_mutex == NULL) {
+    if (ngx_accept_mutex_ptr == NULL) {
         ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
                       "mmap(MAP_ANON|MAP_SHARED) failed");
         /* fatal */
@@ -375,12 +376,13 @@ static void ngx_worker_process_cycle(ngx
     ngx_process = NGX_PROCESS_WORKER;
     ngx_last_process = 0;
 
-    if (ngx_accept_mutex) {
-        ngx_accept_token = 1;
+    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
+
+    if (ccf->worker_processes > 1) {
+        ngx_accept_mutex = ngx_accept_mutex_ptr;
+        ngx_accept_mutex_held = 1;
     }
 
-    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
-
     if (ccf->group != (gid_t) NGX_CONF_UNSET) {
         if (setuid(ccf->group) == -1) {
             ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
@@ -483,6 +485,8 @@ static void ngx_worker_process_cycle(ngx
 
     ngx_close_listening_sockets(cycle);
 
+    ngx_accept_mutex = NULL;
+
     for ( ;; ) {
         if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
             ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
--- a/src/os/win32/ngx_process_cycle.c
+++ b/src/os/win32/ngx_process_cycle.c
@@ -48,6 +48,6 @@ void ngx_master_process_cycle(ngx_cycle_
     for ( ;; ) {
         ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
 
-        ngx_process_events(cycle->log);
+        ngx_process_events(cycle);
     }
 }
--- a/src/os/win32/ngx_win32_config.h
+++ b/src/os/win32/ngx_win32_config.h
@@ -31,6 +31,7 @@
 /* disable some "-W4" level warnings */
 
 #pragma warning(disable:4054)
+#pragma warning(disable:4054)
 #pragma warning(disable:4055)
 /* unreferenced formal parameter */
 #pragma warning(disable:4100)
@@ -43,6 +44,8 @@
 
 
 #ifdef __WATCOMC__
+/* unreachable code */
+#pragma disable_message(201)
 /* disable "Symbol 'ngx_rbtree_min' has been defined, but not referenced" */
 #pragma disable_message(202)
 #endif
@@ -86,6 +89,7 @@ typedef long              time_t;
 typedef __int64           off_t;
 typedef uint32_t          in_addr_t;
 typedef int               sig_atomic_t;
+typedef uint32_t          ngx_atomic_t;
 
 
 #define OFF_T_FMT         "%I64d"