# HG changeset patch # User Igor Sysoev # Date 1073975954 0 # Node ID d427f1c3fe9518f400584a9ff67e50c0df9d6968 # Parent 5d168ebc1ecc8b20aa2cfc92ca0fdc0f6cc5d771 nginx-0.0.1-2004-01-13-09:39:14 import diff --git a/src/core/nginx.c b/src/core/nginx.c --- a/src/core/nginx.c +++ b/src/core/nginx.c @@ -230,9 +230,10 @@ int main(int argc, char *const *argv, ch 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 @@ static void ngx_master_process_cycle(ngx for ( ;; ) { + signo = 0; + first = 1; + /* an event loop */ for ( ;; ) { @@ -299,10 +303,6 @@ static void ngx_master_process_cycle(ngx 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 @@ static void ngx_master_process_cycle(ngx } 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 @@ static void ngx_master_process_cycle(ngx 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 @@ static void ngx_master_process_cycle(ngx } 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 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c @@ -70,6 +70,7 @@ ngx_int_t ngx_spawn_process(ngx_cycle_t (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 @@ void ngx_signal_processes(ngx_cycle_t *c 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 --- a/src/os/unix/ngx_process.h +++ b/src/os/unix/ngx_process.h @@ -16,8 +16,9 @@ typedef struct { unsigned respawn:1; unsigned detached:1; + unsigned signal:1; + unsigned exiting:1; unsigned exited:1; - unsigned exiting:1; } ngx_process_t;