diff src/os/unix/ngx_process_cycle.c @ 389:537de4dca8ca

nginx-0.0.7-2004-07-13-21:59:12 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 13 Jul 2004 17:59:12 +0000
parents 449c4885dcd1
children b670db10cbbd
line wrap: on
line diff
--- 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(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++) {
+
+            if (i == ngx_process_slot || ngx_processes[i].pid == -1) {
+                continue;
+            }
 
-        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);
+            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(
 
     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_cy
     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_cy
                        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_cy
 
                 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_cy
                 }
             }
 
-            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
         }
     }
 
-    for (n = 0; n <= ngx_last_process; n++) {
+    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");
-            }
-
+        if (ngx_processes[n].pid == -1) {
             continue;
         }
 
@@ -610,6 +620,11 @@ static void ngx_worker_process_cycle(ngx
         }
     }
 
+    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