annotate src/os/win32/ngx_process.c @ 3475:ab353d7dc182

*) introduce ngx_time_sigsafe_update() to update the error log time only *) change ngx_time_update() interface
author Igor Sysoev <igor@sysoev.ru>
date Thu, 25 Mar 2010 09:10:10 +0000
parents d4c4cfdffe30
children d620f497c50f
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
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
4 */
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
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
11 int ngx_argc;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
12 char **ngx_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
13 char **ngx_os_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
14
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
15 ngx_int_t ngx_last_process;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
16 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
17
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
18
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
19 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
20 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
21 {
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
22 u_long rc, n, code;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
23 ngx_int_t s;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
24 ngx_pid_t pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
25 ngx_exec_ctx_t ctx;
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
26 HANDLE events[2];
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
27 char file[MAX_PATH + 1];
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
28
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
29 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
30 s = respawn;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
31
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
32 } else {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
33 for (s = 0; s < ngx_last_process; s++) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
34 if (ngx_processes[s].handle == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
35 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
36 }
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 if (s == NGX_MAX_PROCESSES) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
40 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
41 "no more than %d processes can be spawned",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
42 NGX_MAX_PROCESSES);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
43 return NGX_INVALID_PID;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
44 }
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 n = GetModuleFileName(NULL, file, MAX_PATH);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
48
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
49 if (n == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
50 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
51 "GetModuleFileName() failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
52 return NGX_INVALID_PID;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
53 }
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 file[n] = '\0';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
56
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
57 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
58 "GetModuleFileName: \"%s\"", file);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
59
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
60 ctx.path = file;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
61 ctx.name = name;
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
62 ctx.args = GetCommandLine();
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
63 ctx.argv = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
64 ctx.envp = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
65
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
66 pid = ngx_execute(cycle, &ctx);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
67
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
68 if (pid == NGX_INVALID_PID) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
69 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
70 }
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 ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
73
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
74 ngx_processes[s].handle = ctx.child;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
75 ngx_processes[s].pid = pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
76 ngx_processes[s].name = name;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
77
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
78 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
79 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
80 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
81 name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
82
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
83 events[0] = ngx_master_process_event;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
84 events[1] = ctx.child;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
85
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
86 rc = WaitForMultipleObjects(2, events, 0, 5000);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
87
3475
ab353d7dc182 *) introduce ngx_time_sigsafe_update() to update the error log time only
Igor Sysoev <igor@sysoev.ru>
parents: 3474
diff changeset
88 ngx_time_update();
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
89
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
90 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
91 "WaitForMultipleObjects: %ul", rc);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
92
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
93 switch (rc) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
94
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
95 case WAIT_OBJECT_0:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
96
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
97 ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
98 (char *) ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
99 if (ngx_processes[s].term == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
100 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
101 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
102 ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
103 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
104 }
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 ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
107 (char *) ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
108 if (ngx_processes[s].quit == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
109 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
110 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
111 ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
112 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
113 }
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 ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
116 (char *) ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
117 if (ngx_processes[s].reopen == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
118 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
119 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
120 ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
121 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
122 }
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 if (ResetEvent(ngx_master_process_event) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
125 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
126 "ResetEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
127 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
128 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
129 }
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 break;
2737
d52cf82d0d77 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2725
diff changeset
132
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
133 case WAIT_OBJECT_0 + 1:
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
134 if (GetExitCodeProcess(ctx.child, &code) == 0) {
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
135 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
136 "GetExitCodeProcess(%P) failed", pid);
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
137 }
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 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
140 "%s process %P exited with code %Xul",
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
141 name, pid, code);
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
142
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
143 goto failed;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
144
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
145 case WAIT_TIMEOUT:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
146 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
147 "the event \"%s\" was not signaled for 5s",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
148 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
149 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
150
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
151 case WAIT_FAILED:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
152 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
153 "WaitForSingleObject(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
154 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
155
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
156 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
157 }
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 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
160 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
161 }
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 switch (respawn) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
164
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
165 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
166 ngx_processes[s].just_spawn = 0;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
167 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
168
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
169 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
170 ngx_processes[s].just_spawn = 1;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
171 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
172 }
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 if (s == ngx_last_process) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
175 ngx_last_process++;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
176 }
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 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
179
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
180 failed:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
181
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
182 if (ngx_processes[s].reopen) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
183 ngx_close_handle(ngx_processes[s].reopen);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
184 }
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 if (ngx_processes[s].quit) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
187 ngx_close_handle(ngx_processes[s].quit);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
188 }
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 if (ngx_processes[s].term) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
191 ngx_close_handle(ngx_processes[s].term);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
192 }
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 TerminateProcess(ngx_processes[s].handle, 2);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
195
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
196 if (ngx_processes[s].handle) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
197 ngx_close_handle(ngx_processes[s].handle);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
198 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
199
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
200 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
201 }
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
202
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
203
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
204 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
205 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
206 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
207 STARTUPINFO si;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
208 PROCESS_INFORMATION pi;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
209
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
210 ngx_memzero(&si, sizeof(STARTUPINFO));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
211 si.cb = sizeof(STARTUPINFO);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
212
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
213 ngx_memzero(&pi, sizeof(PROCESS_INFORMATION));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
214
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
215 if (CreateProcess(ctx->path, ctx->args,
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
216 NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
217 == 0)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
218 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
219 ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
220 "CreateProcess(\"%s\") failed", ngx_argv[0]);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
221
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
222 return 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
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
225 ctx->child = pi.hProcess;
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 if (CloseHandle(pi.hThread) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
228 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
229 "CloseHandle(pi.hThread) failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
230 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
231
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
232 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
233 "start %s process %P", ctx->name, pi.dwProcessId);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
234
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
235 return pi.dwProcessId;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
236 }