diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2009-06-15 09:48:15 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2009-06-15 09:48:15 +0000 |
| commit | d8615fb29018da7ecb428506204af81b55b46b84 (patch) | |
| tree | 53868e9ef5e13b810f70be3d724a9adc2309e419 /src/os/win32/ngx_process.c | |
| parent | 47246d6a1d65bb11c6db7d074ed8d317813ccfdb (diff) | |
| download | nginx-d8615fb29018da7ecb428506204af81b55b46b84.tar.gz nginx-d8615fb29018da7ecb428506204af81b55b46b84.tar.bz2 | |
merge r2897, r2898, r2899, r2901, r2902, r2904, r2905, r2906, r2907,
r2909, r2910, r2922, r2923, r2924, r2925, r2929:
various win32 fixes:
*) use no-threads for Unix builds only
*) Win32 returns ERROR_PATH_NOT_FOUND instead of ERROR_FILE_NOT_FOUND
*) add trailing zero to a file name in ngx_win32_rename_file()
*) fix logging in ngx_win32_rename_file()
*) allow shared memory segments more than 4G
*) fix memory leak in successful case
*) log shared memory name in failure case
*) test that zone has the same addresses in different processes
*) add drive letter for Win32 root path
*) log GetExitCodeProcess()'s errno
*) test premature process termination
*) fix debug logging
*) exit if no workers could not be started
*) do not quit old workers if no new workers could not be started
*) a signaller process should stop configuration processing just after
it is able to get pid file, this allows to not open log files, etc.
*) win32 master process had aready closed listening sockets
Diffstat (limited to 'src/os/win32/ngx_process.c')
| -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", |
