Mercurial > hg > nginx
annotate src/os/win32/ngx_process.c @ 4687:7f50a4063100
Mp4: fixed non-keyframe seeks in some cases (ticket #175).
Number of entries in stsc atom was wrong if we've added an entry to
split a chunk.
Additionally, there is no need to add an entry if we are going to split
last chunk in an entry, it's enough to update the entry we already have.
Previously new entry was added and old one was left as is, resulting in
incorrect entry with zero chunks which might confuse some software.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 18 Jun 2012 14:01:18 +0000 |
parents | d620f497c50f |
children | e00b71ece8b3 |
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 | 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 | 12 int ngx_argc; |
13 char **ngx_argv; | |
14 char **ngx_os_argv; | |
15 | |
16 ngx_int_t ngx_last_process; | |
17 ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; | |
452 | 18 |
19 | |
2725 | 20 ngx_pid_t |
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 | 24 ngx_int_t s; |
25 ngx_pid_t pid; | |
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 | 28 char file[MAX_PATH + 1]; |
29 | |
30 if (respawn >= 0) { | |
31 s = respawn; | |
32 | |
33 } else { | |
34 for (s = 0; s < ngx_last_process; s++) { | |
35 if (ngx_processes[s].handle == NULL) { | |
36 break; | |
37 } | |
38 } | |
39 | |
40 if (s == NGX_MAX_PROCESSES) { | |
41 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
42 "no more than %d processes can be spawned", | |
43 NGX_MAX_PROCESSES); | |
44 return NGX_INVALID_PID; | |
45 } | |
46 } | |
47 | |
48 n = GetModuleFileName(NULL, file, MAX_PATH); | |
49 | |
50 if (n == 0) { | |
51 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
52 "GetModuleFileName() failed"); | |
53 return NGX_INVALID_PID; | |
54 } | |
55 | |
56 file[n] = '\0'; | |
57 | |
58 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, | |
59 "GetModuleFileName: \"%s\"", file); | |
60 | |
61 ctx.path = file; | |
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 | 64 ctx.argv = NULL; |
65 ctx.envp = NULL; | |
66 | |
67 pid = ngx_execute(cycle, &ctx); | |
68 | |
69 if (pid == NGX_INVALID_PID) { | |
70 return pid; | |
71 } | |
72 | |
73 ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t)); | |
74 | |
75 ngx_processes[s].handle = ctx.child; | |
76 ngx_processes[s].pid = pid; | |
77 ngx_processes[s].name = name; | |
78 | |
79 ngx_sprintf(ngx_processes[s].term_event, "ngx_%s_term_%ul%Z", name, pid); | |
80 ngx_sprintf(ngx_processes[s].quit_event, "ngx_%s_quit_%ul%Z", name, pid); | |
81 ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%ul%Z", | |
82 name, pid); | |
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 | 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 | 90 |
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 | 93 |
94 switch (rc) { | |
95 | |
96 case WAIT_OBJECT_0: | |
97 | |
98 ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0, | |
99 (char *) ngx_processes[s].term_event); | |
100 if (ngx_processes[s].term == NULL) { | |
101 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
102 "OpenEvent(\"%s\") failed", | |
103 ngx_processes[s].term_event); | |
104 goto failed; | |
105 } | |
106 | |
107 ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0, | |
108 (char *) ngx_processes[s].quit_event); | |
109 if (ngx_processes[s].quit == NULL) { | |
110 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
111 "OpenEvent(\"%s\") failed", | |
112 ngx_processes[s].quit_event); | |
113 goto failed; | |
114 } | |
115 | |
116 ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0, | |
117 (char *) ngx_processes[s].reopen_event); | |
118 if (ngx_processes[s].reopen == NULL) { | |
119 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
120 "OpenEvent(\"%s\") failed", | |
121 ngx_processes[s].reopen_event); | |
122 goto failed; | |
123 } | |
124 | |
125 if (ResetEvent(ngx_master_process_event) == 0) { | |
126 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
127 "ResetEvent(\"%s\") failed", | |
128 ngx_master_process_event_name); | |
129 goto failed; | |
130 } | |
131 | |
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 | 146 case WAIT_TIMEOUT: |
147 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
148 "the event \"%s\" was not signaled for 5s", | |
149 ngx_master_process_event_name); | |
150 goto failed; | |
151 | |
152 case WAIT_FAILED: | |
153 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
154 "WaitForSingleObject(\"%s\") failed", | |
155 ngx_master_process_event_name); | |
156 | |
157 goto failed; | |
158 } | |
159 | |
160 if (respawn >= 0) { | |
161 return pid; | |
162 } | |
163 | |
164 switch (respawn) { | |
165 | |
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 | 168 break; |
169 | |
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 | 172 break; |
173 } | |
174 | |
175 if (s == ngx_last_process) { | |
176 ngx_last_process++; | |
177 } | |
178 | |
179 return pid; | |
180 | |
181 failed: | |
182 | |
183 if (ngx_processes[s].reopen) { | |
184 ngx_close_handle(ngx_processes[s].reopen); | |
185 } | |
186 | |
187 if (ngx_processes[s].quit) { | |
188 ngx_close_handle(ngx_processes[s].quit); | |
189 } | |
190 | |
191 if (ngx_processes[s].term) { | |
192 ngx_close_handle(ngx_processes[s].term); | |
193 } | |
194 | |
195 TerminateProcess(ngx_processes[s].handle, 2); | |
196 | |
197 if (ngx_processes[s].handle) { | |
198 ngx_close_handle(ngx_processes[s].handle); | |
199 } | |
200 | |
201 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
|
202 } |
2725 | 203 |
204 | |
205 ngx_pid_t | |
206 ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx) | |
207 { | |
208 STARTUPINFO si; | |
209 PROCESS_INFORMATION pi; | |
210 | |
211 ngx_memzero(&si, sizeof(STARTUPINFO)); | |
212 si.cb = sizeof(STARTUPINFO); | |
213 | |
214 ngx_memzero(&pi, sizeof(PROCESS_INFORMATION)); | |
215 | |
2745
1983932b8075
pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents:
2737
diff
changeset
|
216 if (CreateProcess(ctx->path, ctx->args, |
2725 | 217 NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi) |
218 == 0) | |
219 { | |
220 ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno, | |
221 "CreateProcess(\"%s\") failed", ngx_argv[0]); | |
222 | |
223 return 0; | |
224 } | |
225 | |
226 ctx->child = pi.hProcess; | |
227 | |
228 if (CloseHandle(pi.hThread) == 0) { | |
229 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
230 "CloseHandle(pi.hThread) failed"); | |
231 } | |
232 | |
233 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, | |
234 "start %s process %P", ctx->name, pi.dwProcessId); | |
235 | |
236 return pi.dwProcessId; | |
237 } |