Mercurial > hg > nginx
comparison src/os/unix/ngx_process.c @ 221:401154e21826
nginx-0.0.1-2004-01-08-20:08:10 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 08 Jan 2004 17:08:10 +0000 |
parents | 4f81b931e9ff |
children | 99df0edb63ed |
comparison
equal
deleted
inserted
replaced
220:4f81b931e9ff | 221:401154e21826 |
---|---|
5 | 5 |
6 static void ngx_exec_proc(ngx_cycle_t *cycle, void *data); | 6 static void ngx_exec_proc(ngx_cycle_t *cycle, void *data); |
7 | 7 |
8 ngx_uint_t ngx_last_process; | 8 ngx_uint_t ngx_last_process; |
9 ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; | 9 ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; |
10 | |
11 sigset_t ngx_sigmask; | |
12 | |
13 | |
14 void ngx_wait_events() | |
15 { | |
16 sigsuspend(&ngx_sigmask); | |
17 } | |
18 | 10 |
19 | 11 |
20 ngx_int_t ngx_spawn_process(ngx_cycle_t *cycle, | 12 ngx_int_t ngx_spawn_process(ngx_cycle_t *cycle, |
21 ngx_spawn_proc_pt proc, void *data, | 13 ngx_spawn_proc_pt proc, void *data, |
22 char *name, ngx_int_t respawn) | 14 char *name, ngx_int_t respawn) |
120 } | 112 } |
121 | 113 |
122 | 114 |
123 void ngx_signal_processes(ngx_cycle_t *cycle, ngx_int_t signal) | 115 void ngx_signal_processes(ngx_cycle_t *cycle, ngx_int_t signal) |
124 { | 116 { |
125 sigset_t set, oset; | |
126 ngx_uint_t i; | 117 ngx_uint_t i; |
127 | |
128 sigemptyset(&set); | |
129 sigaddset(&set, SIGCHLD); | |
130 if (sigprocmask(SIG_BLOCK, &set, &oset) == -1) { | |
131 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
132 "sigprocmask() failed while signaling processes"); | |
133 return; | |
134 } | |
135 | 118 |
136 for (i = 0; i < ngx_last_process; i++) { | 119 for (i = 0; i < ngx_last_process; i++) { |
137 | 120 |
138 if (ngx_processes[i].detached) { | 121 if (ngx_processes[i].detached) { |
139 continue; | 122 continue; |
158 | 141 |
159 if (signal != ngx_signal_value(NGX_REOPEN_SIGNAL)) { | 142 if (signal != ngx_signal_value(NGX_REOPEN_SIGNAL)) { |
160 ngx_processes[i].exiting = 1; | 143 ngx_processes[i].exiting = 1; |
161 } | 144 } |
162 } | 145 } |
163 | |
164 if (sigprocmask(SIG_SETMASK, &oset, &set) == -1) { | |
165 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
166 "sigprocmask() failed while signaling processes"); | |
167 } | |
168 } | 146 } |
169 | 147 |
170 | 148 |
171 void ngx_respawn_processes(ngx_cycle_t *cycle) | 149 void ngx_respawn_processes(ngx_cycle_t *cycle) |
172 { | 150 { |
173 sigset_t set, oset; | |
174 ngx_uint_t i; | 151 ngx_uint_t i; |
175 | 152 |
176 sigemptyset(&set); | 153 for (i = 0; i < ngx_last_process; i++) { |
177 sigaddset(&set, SIGCHLD); | 154 if (!ngx_processes[i].exited) { |
178 if (sigprocmask(SIG_BLOCK, &set, &oset) == -1) { | 155 continue; |
179 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 156 } |
180 "sigprocmask() failed while respawning processes"); | 157 |
181 return; | 158 if (!ngx_processes[i].respawn) { |
182 } | 159 if (i != --ngx_last_process) { |
183 | 160 ngx_processes[i--] = ngx_processes[ngx_last_process]; |
184 /* | 161 } |
185 * to avoid a race condition we can check and set value of ngx_respawn | 162 continue; |
186 * only in signal handler or while SIGCHLD is blocked | 163 } |
187 */ | 164 |
188 | 165 if (ngx_spawn_process(cycle, |
189 if (ngx_respawn) { | 166 ngx_processes[i].proc, ngx_processes[i].data, |
190 | 167 ngx_processes[i].name, i) == NGX_ERROR) |
191 for (i = 0; i < ngx_last_process; i++) { | 168 { |
192 if (!ngx_processes[i].exited) { | 169 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, |
193 continue; | 170 "can not respawn %s", ngx_processes[i].name); |
194 } | 171 } |
195 | |
196 if (!ngx_processes[i].respawn) { | |
197 if (i != --ngx_last_process) { | |
198 ngx_processes[i--] = ngx_processes[ngx_last_process]; | |
199 } | |
200 continue; | |
201 } | |
202 | |
203 if (ngx_spawn_process(cycle, | |
204 ngx_processes[i].proc, ngx_processes[i].data, | |
205 ngx_processes[i].name, i) == NGX_ERROR) | |
206 { | |
207 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
208 "can not respawn %s", ngx_processes[i].name); | |
209 } | |
210 } | |
211 | |
212 ngx_respawn = 0; | |
213 } | |
214 | |
215 if (sigprocmask(SIG_SETMASK, &oset, &set) == -1) { | |
216 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
217 "sigprocmask() failed while respawning processes"); | |
218 } | 172 } |
219 } | 173 } |
220 | 174 |
221 | 175 |
222 void ngx_process_get_status() | 176 void ngx_process_get_status() |
259 if (ngx_processes[i].pid == pid) { | 213 if (ngx_processes[i].pid == pid) { |
260 ngx_processes[i].status = status; | 214 ngx_processes[i].status = status; |
261 | 215 |
262 if (!ngx_processes[i].exiting) { | 216 if (!ngx_processes[i].exiting) { |
263 ngx_processes[i].exited = 1; | 217 ngx_processes[i].exited = 1; |
264 | |
265 if (ngx_processes[i].respawn) { | |
266 ngx_respawn = 1; | |
267 } | |
268 } | 218 } |
269 | 219 |
270 process = ngx_processes[i].name; | 220 process = ngx_processes[i].name; |
271 break; | 221 break; |
272 } | 222 } |