aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix/ngx_process_cycle.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2004-07-13 17:59:12 +0000
committerIgor Sysoev <igor@sysoev.ru>2004-07-13 17:59:12 +0000
commita14f89c0683452d573131795e24be2f2fe7580f9 (patch)
tree47fb65b399898c4076199da74186b51c30fd003a /src/os/unix/ngx_process_cycle.c
parent643c8ea353d4495fb4bbbde1cc7126a37f9a690f (diff)
downloadnginx-a14f89c0683452d573131795e24be2f2fe7580f9.tar.gz
nginx-a14f89c0683452d573131795e24be2f2fe7580f9.zip
nginx-0.0.7-2004-07-13-21:59:12 import
Diffstat (limited to 'src/os/unix/ngx_process_cycle.c')
-rw-r--r--src/os/unix/ngx_process_cycle.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c
index 83b8da8c2..4ff2bae01 100644
--- a/src/os/unix/ngx_process_cycle.c
+++ b/src/os/unix/ngx_process_cycle.c
@@ -306,11 +306,17 @@ static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n,
ch.slot = ngx_process_slot;
ch.fd = ngx_processes[ngx_process_slot].channel[0];
- for (i = 0; i < ngx_last_process - 1; i++) {
+ for (i = 0; i < ngx_last_process; i++) {
- ngx_log_debug4(NGX_LOG_DEBUG_CORE, cycle->log, 0,
- "pass channel s: %d pid:" PID_T_FMT " fd:%d to:"
- PID_T_FMT, ch.slot, ch.pid, ch.fd, ngx_processes[i].pid);
+ if (i == ngx_process_slot || ngx_processes[i].pid == -1) {
+ continue;
+ }
+
+ ngx_log_debug5(NGX_LOG_DEBUG_CORE, cycle->log, 0,
+ "pass channel s:%d pid:" PID_T_FMT
+ " fd:%d to s:%d pid:" PID_T_FMT,
+ ch.slot, ch.pid, ch.fd,
+ i, ngx_processes[i].pid);
/* TODO: NGX_AGAIN */
@@ -367,7 +373,7 @@ static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo)
for (i = 0; i < ngx_last_process; i++) {
- if (ngx_processes[i].detached) {
+ if (ngx_processes[i].detached || ngx_processes[i].pid == -1) {
continue;
}
@@ -432,8 +438,9 @@ static ngx_uint_t ngx_reap_childs(ngx_cycle_t *cycle)
live = 0;
for (i = 0; i < ngx_last_process; i++) {
- ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
- "child: " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d",
+ ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+ "child: %d " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d",
+ i,
ngx_processes[i].pid,
ngx_processes[i].exiting,
ngx_processes[i].exited,
@@ -441,6 +448,10 @@ static ngx_uint_t ngx_reap_childs(ngx_cycle_t *cycle)
ngx_processes[i].respawn,
ngx_processes[i].just_respawn);
+ if (ngx_processes[i].pid == -1) {
+ continue;
+ }
+
if (ngx_processes[i].exited) {
if (!ngx_processes[i].detached) {
@@ -454,13 +465,14 @@ static ngx_uint_t ngx_reap_childs(ngx_cycle_t *cycle)
for (n = 0; n < ngx_last_process; n++) {
if (ngx_processes[n].exited
+ || ngx_processes[n].pid == -1
|| ngx_processes[n].channel[0] == -1)
{
continue;
}
ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0,
- "pass close channel s: %d pid:" PID_T_FMT
+ "pass close channel s:%d pid:" PID_T_FMT
" to:" PID_T_FMT, ch.slot, ch.pid, ngx_processes[n].pid);
/* TODO: NGX_AGAIN */
@@ -498,8 +510,11 @@ static ngx_uint_t ngx_reap_childs(ngx_cycle_t *cycle)
}
}
- if (i != --ngx_last_process) {
- ngx_processes[i--] = ngx_processes[ngx_last_process];
+ if (i == ngx_last_process - 1) {
+ ngx_last_process--;
+
+ } else {
+ ngx_processes[i].pid = -1;
}
} else if (ngx_processes[i].exiting || !ngx_processes[i].detached) {
@@ -593,14 +608,9 @@ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
}
}
- for (n = 0; n <= ngx_last_process; n++) {
-
- if (n == ngx_process_slot) {
- if (close(ngx_processes[n].channel[0]) == -1) {
- ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
- "close() failed");
- }
+ for (n = 0; n < ngx_last_process; n++) {
+ if (ngx_processes[n].pid == -1) {
continue;
}
@@ -610,6 +620,11 @@ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
}
}
+ if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+ "close() failed");
+ }
+
#if 0
ngx_last_process = 0;
#endif