diff options
author | Igor Sysoev <igor@sysoev.ru> | 2009-06-02 18:26:59 +0400 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2009-06-02 18:26:59 +0400 |
commit | 42846485a23246b55bd9ff6b59ccc85ba8066b70 (patch) | |
tree | 96a38b244156cbc630cacfb4c4555d42e3f6c38a /src | |
parent | 130690fceb00bf93397311cd3dc244d07634ba14 (diff) |
test premature process termination
Diffstat (limited to 'src')
-rw-r--r-- | src/os/win32/ngx_process.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/os/win32/ngx_process.c b/src/os/win32/ngx_process.c index bbc7afa9e..e7c283612 100644 --- 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_PROCESSES]; 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, char *name, ngx_int_t respawn) 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, char *name, ngx_int_t respawn) 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", |