nginx-0.0.1-2004-01-13-09:39:14 import
diff --git a/src/core/nginx.c b/src/core/nginx.c index 25b1b08..742aeb8 100644 --- a/src/core/nginx.c +++ b/src/core/nginx.c
@@ -230,9 +230,10 @@ static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) { + int signo; ngx_msec_t delay; struct timeval tv; - ngx_uint_t i, live; + ngx_uint_t i, live, first; sigset_t set, wset; delay = 125; @@ -277,6 +278,9 @@ for ( ;; ) { + signo = 0; + first = 1; + /* an event loop */ for ( ;; ) { @@ -299,10 +303,6 @@ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "quit cycle"); - if (delay < 15000) { - delay *= 2; - } - if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, "sigprocmask() failed"); @@ -310,8 +310,13 @@ } if (ngx_reap == 0) { + + if (delay < 15000) { + delay *= 2; + } + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "sleep %d", delay / 1000); + "msleep %d", delay); ngx_msleep(delay); @@ -369,23 +374,20 @@ if (ngx_terminate) { if (delay > 10000) { - ngx_signal_processes(cycle, SIGKILL); + signo = SIGKILL; } else { - ngx_signal_processes(cycle, - ngx_signal_value(NGX_TERMINATE_SIGNAL)); + signo = ngx_signal_value(NGX_TERMINATE_SIGNAL); } ngx_process = NGX_PROCESS_QUITING; } if (ngx_quit) { - ngx_signal_processes(cycle, - ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); + signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL); ngx_process = NGX_PROCESS_QUITING; } if (ngx_pause) { - ngx_signal_processes(cycle, - ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); + signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL); ngx_process = NGX_PROCESS_PAUSED; } @@ -402,26 +404,35 @@ } if (ngx_reconfigure) { + signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL); ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reconfiguring"); - break; } if (ngx_reopen) { + signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL); ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopening logs"); ngx_reopen_files(cycle); ngx_reopen = 0; } - if (first) { - for (i = 0; i < ngx_last_process; i++) { - if (!ngx_processes[i].detached) { - ngx_processes[i].signal = 1; + if (signo) { + if (first) { + for (i = 0; i < ngx_last_process; i++) { + if (!ngx_processes[i].detached) { + ngx_processes[i].signal = 1; + } } + first = 0; + delay = 125; } - first = 1; + + ngx_signal_processes(cycle, signo); } + if (ngx_reconfigure) { + break; + } } if (ngx_process == NGX_PROCESS_PAUSED) {
diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index 685b0d1..b660d8b 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c
@@ -70,6 +70,7 @@ (respawn == NGX_PROCESS_RESPAWN) ? 1 : 0; ngx_processes[ngx_last_process].detached = (respawn == NGX_PROCESS_DETACHED) ? 1 : 0; + ngx_processes[ngx_last_process].signal = 0; ngx_processes[ngx_last_process].exited = 0; ngx_processes[ngx_last_process].exiting = 0; ngx_last_process++; @@ -118,7 +119,7 @@ for (i = 0; i < ngx_last_process; i++) { - if (ngx_processes[i].detached) { + if (!ngx_processes[i].signal) { continue; }
diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h index d8727c3..a71f682 100644 --- a/src/os/unix/ngx_process.h +++ b/src/os/unix/ngx_process.h
@@ -16,8 +16,9 @@ unsigned respawn:1; unsigned detached:1; - unsigned exited:1; + unsigned signal:1; unsigned exiting:1; + unsigned exited:1; } ngx_process_t;