annotate src/os/win32/ngx_process.c @ 4796:0327b63390be stable-1.2

Merge of r4758: win32: fixed cpu hog after process startup failure. If ngx_spawn_process() failed while starting a process, the process handle was closed but left non-NULL in the ngx_processes[] array. The handle later was used in WaitForMultipleObjects() (if there were multiple worker processes configured and at least one worker process was started successfully), resulting in infinite loop. Reported by Ricardo Villalobos Guevara: http://mailman.nginx.org/pipermail/nginx-devel/2012-July/002494.html
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 06 Aug 2012 16:24:22 +0000
parents d620f497c50f
children 2b7dacb381ed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3475
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
6
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
12 int ngx_argc;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
13 char **ngx_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
14 char **ngx_os_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
15
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
16 ngx_int_t ngx_last_process;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
17 ngx_process_t ngx_processes[NGX_MAX_PROCESSES];
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
18
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
19
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
20 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
21 ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn)
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
22 {
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
23 u_long rc, n, code;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
24 ngx_int_t s;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
25 ngx_pid_t pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
26 ngx_exec_ctx_t ctx;
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
27 HANDLE events[2];
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
28 char file[MAX_PATH + 1];
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
29
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
30 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
31 s = respawn;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
32
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
33 } else {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
34 for (s = 0; s < ngx_last_process; s++) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
35 if (ngx_processes[s].handle == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
36 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
37 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
38 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
39
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
40 if (s == NGX_MAX_PROCESSES) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
41 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
42 "no more than %d processes can be spawned",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
43 NGX_MAX_PROCESSES);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
44 return NGX_INVALID_PID;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
45 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
46 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
47
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
48 n = GetModuleFileName(NULL, file, MAX_PATH);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
49
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
50 if (n == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
51 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
52 "GetModuleFileName() failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
53 return NGX_INVALID_PID;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
54 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
55
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
56 file[n] = '\0';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
57
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
58 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
59 "GetModuleFileName: \"%s\"", file);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
60
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
61 ctx.path = file;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
62 ctx.name = name;
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
63 ctx.args = GetCommandLine();
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
64 ctx.argv = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
65 ctx.envp = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
66
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
67 pid = ngx_execute(cycle, &ctx);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
68
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
69 if (pid == NGX_INVALID_PID) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
70 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
71 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
72
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
73 ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
74
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
75 ngx_processes[s].handle = ctx.child;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
76 ngx_processes[s].pid = pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
77 ngx_processes[s].name = name;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
78
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
79 ngx_sprintf(ngx_processes[s].term_event, "ngx_%s_term_%ul%Z", name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
80 ngx_sprintf(ngx_processes[s].quit_event, "ngx_%s_quit_%ul%Z", name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
81 ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%ul%Z",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
82 name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
83
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
84 events[0] = ngx_master_process_event;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
85 events[1] = ctx.child;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
86
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
87 rc = WaitForMultipleObjects(2, events, 0, 5000);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
88
3475
ab353d7dc182 *) introduce ngx_time_sigsafe_update() to update the error log time only
Igor Sysoev <igor@sysoev.ru>
parents: 3474
diff changeset
89 ngx_time_update();
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
90
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
91 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
92 "WaitForMultipleObjects: %ul", rc);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
93
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
94 switch (rc) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
95
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
96 case WAIT_OBJECT_0:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
97
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
98 ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
99 (char *) ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
100 if (ngx_processes[s].term == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
101 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
102 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
103 ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
104 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
105 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
106
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
107 ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
108 (char *) ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
109 if (ngx_processes[s].quit == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
110 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
111 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
112 ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
113 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
114 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
115
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
116 ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
117 (char *) ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
118 if (ngx_processes[s].reopen == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
119 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
120 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
121 ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
122 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
123 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
124
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
125 if (ResetEvent(ngx_master_process_event) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
126 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
127 "ResetEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
128 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
129 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
130 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
131
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
132 break;
2737
d52cf82d0d77 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2725
diff changeset
133
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
134 case WAIT_OBJECT_0 + 1:
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
135 if (GetExitCodeProcess(ctx.child, &code) == 0) {
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
136 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
137 "GetExitCodeProcess(%P) failed", pid);
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
138 }
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
139
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
140 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
141 "%s process %P exited with code %Xul",
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
142 name, pid, code);
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
143
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
144 goto failed;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
145
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
146 case WAIT_TIMEOUT:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
147 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
148 "the event \"%s\" was not signaled for 5s",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
149 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
150 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
151
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
152 case WAIT_FAILED:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
153 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
154 "WaitForSingleObject(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
155 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
156
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
157 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
158 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
159
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
160 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
161 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
162 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
163
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
164 switch (respawn) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
165
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
166 case NGX_PROCESS_RESPAWN:
3016
d82993af1da0 introduce NGX_PROCESS_JUST_SPAWN and change field name accordingly
Igor Sysoev <igor@sysoev.ru>
parents: 2909
diff changeset
167 ngx_processes[s].just_spawn = 0;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
168 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
169
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
170 case NGX_PROCESS_JUST_RESPAWN:
3016
d82993af1da0 introduce NGX_PROCESS_JUST_SPAWN and change field name accordingly
Igor Sysoev <igor@sysoev.ru>
parents: 2909
diff changeset
171 ngx_processes[s].just_spawn = 1;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
172 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
173 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
174
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
175 if (s == ngx_last_process) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
176 ngx_last_process++;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
177 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
178
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
179 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
180
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
181 failed:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
182
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
183 if (ngx_processes[s].reopen) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
184 ngx_close_handle(ngx_processes[s].reopen);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
185 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
186
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
187 if (ngx_processes[s].quit) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
188 ngx_close_handle(ngx_processes[s].quit);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
189 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
190
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
191 if (ngx_processes[s].term) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
192 ngx_close_handle(ngx_processes[s].term);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
193 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
194
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
195 TerminateProcess(ngx_processes[s].handle, 2);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
196
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
197 if (ngx_processes[s].handle) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
198 ngx_close_handle(ngx_processes[s].handle);
4796
0327b63390be Merge of r4758: win32: fixed cpu hog after process startup failure.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
199 ngx_processes[s].handle = NULL;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
200 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
201
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
202 return NGX_INVALID_PID;
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 }
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
204
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
205
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
206 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
207 ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
208 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
209 STARTUPINFO si;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
210 PROCESS_INFORMATION pi;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
211
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
212 ngx_memzero(&si, sizeof(STARTUPINFO));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
213 si.cb = sizeof(STARTUPINFO);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
214
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
215 ngx_memzero(&pi, sizeof(PROCESS_INFORMATION));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
216
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
217 if (CreateProcess(ctx->path, ctx->args,
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
218 NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
219 == 0)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
220 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
221 ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
222 "CreateProcess(\"%s\") failed", ngx_argv[0]);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
223
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
224 return 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
225 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
226
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
227 ctx->child = pi.hProcess;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
228
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
229 if (CloseHandle(pi.hThread) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
230 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
231 "CloseHandle(pi.hThread) failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
232 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
233
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
234 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
235 "start %s process %P", ctx->name, pi.dwProcessId);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
236
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
237 return pi.dwProcessId;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
238 }