comparison src/os/unix/ngx_process_cycle.c @ 3102:4b5cf483c6a8 stable-0.7

merge r3047, r3048, r3049: twice termination delay only after SIGALRM, otherwise many separate SIGCHLD and SIGIO signals quickly increase delay to the level when SIGKILL is sent
author Igor Sysoev <igor@sysoev.ru>
date Mon, 07 Sep 2009 11:31:20 +0000
parents d19979e0d980
children 1f3cd08ebb82
comparison
equal deleted inserted replaced
3101:49272f5b45a6 3102:4b5cf483c6a8
32 ngx_pid_t ngx_pid; 32 ngx_pid_t ngx_pid;
33 ngx_uint_t ngx_threaded; 33 ngx_uint_t ngx_threaded;
34 34
35 sig_atomic_t ngx_reap; 35 sig_atomic_t ngx_reap;
36 sig_atomic_t ngx_sigio; 36 sig_atomic_t ngx_sigio;
37 sig_atomic_t ngx_sigalrm;
37 sig_atomic_t ngx_terminate; 38 sig_atomic_t ngx_terminate;
38 sig_atomic_t ngx_quit; 39 sig_atomic_t ngx_quit;
39 sig_atomic_t ngx_debug_quit; 40 sig_atomic_t ngx_debug_quit;
40 ngx_uint_t ngx_exiting; 41 ngx_uint_t ngx_exiting;
41 sig_atomic_t ngx_reconfigure; 42 sig_atomic_t ngx_reconfigure;
128 delay = 0; 129 delay = 0;
129 live = 1; 130 live = 1;
130 131
131 for ( ;; ) { 132 for ( ;; ) {
132 if (delay) { 133 if (delay) {
133 delay *= 2; 134 if (ngx_sigalrm) {
135 delay *= 2;
136 ngx_sigalrm = 0;
137 }
134 138
135 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, 139 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
136 "temination cycle: %d", delay); 140 "termination cycle: %d", delay);
137 141
138 itv.it_interval.tv_sec = 0; 142 itv.it_interval.tv_sec = 0;
139 itv.it_interval.tv_usec = 0; 143 itv.it_interval.tv_usec = 0;
140 itv.it_value.tv_sec = delay / 1000; 144 itv.it_value.tv_sec = delay / 1000;
141 itv.it_value.tv_usec = (delay % 1000 ) * 1000; 145 itv.it_value.tv_usec = (delay % 1000 ) * 1000;
490 "kill (%P, %d)" , ngx_processes[i].pid, signo); 494 "kill (%P, %d)" , ngx_processes[i].pid, signo);
491 495
492 if (kill(ngx_processes[i].pid, signo) == -1) { 496 if (kill(ngx_processes[i].pid, signo) == -1) {
493 err = ngx_errno; 497 err = ngx_errno;
494 ngx_log_error(NGX_LOG_ALERT, cycle->log, err, 498 ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
495 "kill(%P, %d) failed", 499 "kill(%P, %d) failed", ngx_processes[i].pid, signo);
496 ngx_processes[i].pid, signo);
497 500
498 if (err == NGX_ESRCH) { 501 if (err == NGX_ESRCH) {
499 ngx_processes[i].exited = 1; 502 ngx_processes[i].exited = 1;
500 ngx_processes[i].exiting = 0; 503 ngx_processes[i].exiting = 0;
501 ngx_reap = 1; 504 ngx_reap = 1;