Mercurial > hg > nginx-quic
annotate src/os/win32/ngx_process.c @ 2764:d4a717592877
use ngx_vslprintf(), ngx_slprintf()
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 27 Apr 2009 13:06:20 +0000 |
parents | 1983932b8075 |
children | 3f287b615408 |
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 | 11 int ngx_argc; |
12 char **ngx_argv; | |
13 char **ngx_os_argv; | |
14 | |
15 ngx_int_t ngx_last_process; | |
16 ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; | |
452 | 17 |
18 | |
2725 | 19 ngx_pid_t |
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 { |
2725 | 22 u_long rc, n; |
23 ngx_int_t s; | |
24 ngx_pid_t pid; | |
25 ngx_exec_ctx_t ctx; | |
26 char file[MAX_PATH + 1]; | |
27 | |
28 if (respawn >= 0) { | |
29 s = respawn; | |
30 | |
31 } else { | |
32 for (s = 0; s < ngx_last_process; s++) { | |
33 if (ngx_processes[s].handle == NULL) { | |
34 break; | |
35 } | |
36 } | |
37 | |
38 if (s == NGX_MAX_PROCESSES) { | |
39 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
40 "no more than %d processes can be spawned", | |
41 NGX_MAX_PROCESSES); | |
42 return NGX_INVALID_PID; | |
43 } | |
44 } | |
45 | |
46 n = GetModuleFileName(NULL, file, MAX_PATH); | |
47 | |
48 if (n == 0) { | |
49 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
50 "GetModuleFileName() failed"); | |
51 return NGX_INVALID_PID; | |
52 } | |
53 | |
54 file[n] = '\0'; | |
55 | |
56 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, | |
57 "GetModuleFileName: \"%s\"", file); | |
58 | |
59 ctx.path = file; | |
60 ctx.name = name; | |
2745
1983932b8075
pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents:
2737
diff
changeset
|
61 ctx.args = GetCommandLine(); |
2725 | 62 ctx.argv = NULL; |
63 ctx.envp = NULL; | |
64 | |
65 pid = ngx_execute(cycle, &ctx); | |
66 | |
67 if (pid == NGX_INVALID_PID) { | |
68 return pid; | |
69 } | |
70 | |
71 ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t)); | |
72 | |
73 ngx_processes[s].handle = ctx.child; | |
74 ngx_processes[s].pid = pid; | |
75 ngx_processes[s].name = name; | |
76 | |
77 ngx_sprintf(ngx_processes[s].term_event, "ngx_%s_term_%ul%Z", name, pid); | |
78 ngx_sprintf(ngx_processes[s].quit_event, "ngx_%s_quit_%ul%Z", name, pid); | |
79 ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%ul%Z", | |
80 name, pid); | |
81 | |
82 rc = WaitForSingleObject(ngx_master_process_event, 5000); | |
83 | |
84 ngx_time_update(0, 0); | |
85 | |
86 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, | |
87 "WaitForSingleObject: %ul", rc); | |
88 | |
89 switch (rc) { | |
90 | |
91 case WAIT_OBJECT_0: | |
92 | |
93 ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0, | |
94 (char *) ngx_processes[s].term_event); | |
95 if (ngx_processes[s].term == NULL) { | |
96 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
97 "OpenEvent(\"%s\") failed", | |
98 ngx_processes[s].term_event); | |
99 goto failed; | |
100 } | |
101 | |
102 ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0, | |
103 (char *) ngx_processes[s].quit_event); | |
104 if (ngx_processes[s].quit == NULL) { | |
105 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
106 "OpenEvent(\"%s\") failed", | |
107 ngx_processes[s].quit_event); | |
108 goto failed; | |
109 } | |
110 | |
111 ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0, | |
112 (char *) ngx_processes[s].reopen_event); | |
113 if (ngx_processes[s].reopen == NULL) { | |
114 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
115 "OpenEvent(\"%s\") failed", | |
116 ngx_processes[s].reopen_event); | |
117 goto failed; | |
118 } | |
119 | |
120 if (ResetEvent(ngx_master_process_event) == 0) { | |
121 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
122 "ResetEvent(\"%s\") failed", | |
123 ngx_master_process_event_name); | |
124 goto failed; | |
125 } | |
126 | |
127 break; | |
2737
d52cf82d0d77
style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents:
2725
diff
changeset
|
128 |
2725 | 129 case WAIT_TIMEOUT: |
130 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
131 "the event \"%s\" was not signaled for 5s", | |
132 ngx_master_process_event_name); | |
133 goto failed; | |
134 | |
135 case WAIT_FAILED: | |
136 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
137 "WaitForSingleObject(\"%s\") failed", | |
138 ngx_master_process_event_name); | |
139 | |
140 goto failed; | |
141 } | |
142 | |
143 if (respawn >= 0) { | |
144 return pid; | |
145 } | |
146 | |
147 switch (respawn) { | |
148 | |
149 case NGX_PROCESS_RESPAWN: | |
150 ngx_processes[s].just_respawn = 0; | |
151 break; | |
152 | |
153 case NGX_PROCESS_JUST_RESPAWN: | |
154 ngx_processes[s].just_respawn = 1; | |
155 break; | |
156 } | |
157 | |
158 if (s == ngx_last_process) { | |
159 ngx_last_process++; | |
160 } | |
161 | |
162 return pid; | |
163 | |
164 failed: | |
165 | |
166 if (ngx_processes[s].reopen) { | |
167 ngx_close_handle(ngx_processes[s].reopen); | |
168 } | |
169 | |
170 if (ngx_processes[s].quit) { | |
171 ngx_close_handle(ngx_processes[s].quit); | |
172 } | |
173 | |
174 if (ngx_processes[s].term) { | |
175 ngx_close_handle(ngx_processes[s].term); | |
176 } | |
177 | |
178 TerminateProcess(ngx_processes[s].handle, 2); | |
179 | |
180 if (ngx_processes[s].handle) { | |
181 ngx_close_handle(ngx_processes[s].handle); | |
182 } | |
183 | |
184 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
|
185 } |
2725 | 186 |
187 | |
188 ngx_pid_t | |
189 ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx) | |
190 { | |
191 STARTUPINFO si; | |
192 PROCESS_INFORMATION pi; | |
193 | |
194 ngx_memzero(&si, sizeof(STARTUPINFO)); | |
195 si.cb = sizeof(STARTUPINFO); | |
196 | |
197 ngx_memzero(&pi, sizeof(PROCESS_INFORMATION)); | |
198 | |
2745
1983932b8075
pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents:
2737
diff
changeset
|
199 if (CreateProcess(ctx->path, ctx->args, |
2725 | 200 NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi) |
201 == 0) | |
202 { | |
203 ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno, | |
204 "CreateProcess(\"%s\") failed", ngx_argv[0]); | |
205 | |
206 return 0; | |
207 } | |
208 | |
209 ctx->child = pi.hProcess; | |
210 | |
211 if (CloseHandle(pi.hThread) == 0) { | |
212 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
213 "CloseHandle(pi.hThread) failed"); | |
214 } | |
215 | |
216 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, | |
217 "start %s process %P", ctx->name, pi.dwProcessId); | |
218 | |
219 return pi.dwProcessId; | |
220 } |