changeset 2909:3f287b615408

test premature process termination
author Igor Sysoev <igor@sysoev.ru>
date Tue, 02 Jun 2009 14:26:59 +0000
parents 234a8248812c
children dc01b26f8de8
files src/os/win32/ngx_process.c
diffstat 1 files changed, 19 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/os/win32/ngx_process.c
+++ b/src/os/win32/ngx_process.c
@@ -19,10 +19,11 @@ ngx_process_t    ngx_processes[NGX_MAX_P
 ngx_pid_t
 ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn)
 {
-    u_long          rc, n;
+    u_long          rc, n, code;
     ngx_int_t       s;
     ngx_pid_t       pid;
     ngx_exec_ctx_t  ctx;
+    HANDLE          events[2];
     char            file[MAX_PATH + 1];
 
     if (respawn >= 0) {
@@ -79,12 +80,15 @@ ngx_spawn_process(ngx_cycle_t *cycle, ch
     ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%ul%Z",
                 name, pid);
 
-    rc = WaitForSingleObject(ngx_master_process_event, 5000);
+    events[0] = ngx_master_process_event;
+    events[1] = ctx.child;
+
+    rc = WaitForMultipleObjects(2, events, 0, 5000);
 
     ngx_time_update(0, 0);
 
     ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
-                   "WaitForSingleObject: %ul", rc);
+                   "WaitForMultipleObjects: %ul", rc);
 
     switch (rc) {
 
@@ -126,6 +130,18 @@ ngx_spawn_process(ngx_cycle_t *cycle, ch
 
         break;
 
+    case WAIT_OBJECT_0 + 1:
+        if (GetExitCodeProcess(ctx.child, &code) == 0) {
+            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                          "GetExitCodeProcess(%P) failed", pid);
+        }
+
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                      "%s process %P exited with code %Xul",
+                      name, pid, code);
+
+        goto failed;
+
     case WAIT_TIMEOUT:
         ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
                       "the event \"%s\" was not signaled for 5s",