# HG changeset patch # User Igor Sysoev # Date 1080800473 0 # Node ID 1526e7686b20a7a2cbbdf666f0af70c45f66a13a # Parent 744965ec62756ac0187069d4ad6642578073f628 nginx-0.0.3-2004-04-01-10:21:13 import diff --git a/auto/cc b/auto/cc --- 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 diff --git a/auto/configure b/auto/configure --- 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 diff --git a/src/core/ngx_atomic.h b/src/core/ngx_atomic.h --- 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 diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c --- 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); diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c --- 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); diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c --- 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) { diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h --- 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; diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c --- 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; diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c --- 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"); diff --git a/src/os/win32/ngx_process_cycle.c b/src/os/win32/ngx_process_cycle.c --- 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); } } diff --git a/src/os/win32/ngx_win32_config.h b/src/os/win32/ngx_win32_config.h --- 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"