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 }