Mercurial > hg > nginx
comparison src/core/nginx.c @ 243:bf2faf694c19
nginx-0.0.1-2004-01-28-23:38:54 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 28 Jan 2004 20:38:54 +0000 |
parents | 674f85a4d00f |
children | e885208c518b |
comparison
equal
deleted
inserted
replaced
242:5d4f49dc8de5 | 243:bf2faf694c19 |
---|---|
83 | 83 |
84 ngx_int_t ngx_process; | 84 ngx_int_t ngx_process; |
85 ngx_pid_t ngx_new_binary; | 85 ngx_pid_t ngx_new_binary; |
86 | 86 |
87 ngx_int_t ngx_inherited; | 87 ngx_int_t ngx_inherited; |
88 ngx_int_t ngx_signal; | |
89 ngx_int_t ngx_reap; | 88 ngx_int_t ngx_reap; |
89 ngx_int_t ngx_timer; | |
90 ngx_int_t ngx_terminate; | 90 ngx_int_t ngx_terminate; |
91 ngx_int_t ngx_quit; | 91 ngx_int_t ngx_quit; |
92 ngx_int_t ngx_noaccept; | 92 ngx_int_t ngx_noaccept; |
93 ngx_int_t ngx_reconfigure; | 93 ngx_int_t ngx_reconfigure; |
94 ngx_int_t ngx_reopen; | 94 ngx_int_t ngx_reopen; |
227 | 227 |
228 /* TODO: broken single process */ | 228 /* TODO: broken single process */ |
229 | 229 |
230 static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) | 230 static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) |
231 { | 231 { |
232 int signo; | 232 int signo; |
233 char *name; | 233 sigset_t set; |
234 sigset_t set, wset; | 234 struct timeval tv; |
235 struct timeval tv; | 235 struct itimerval itv; |
236 ngx_uint_t i, live; | 236 ngx_uint_t i, live; |
237 ngx_msec_t delay; | 237 ngx_msec_t delay; |
238 ngx_core_conf_t *ccf; | 238 ngx_core_conf_t *ccf; |
239 | 239 |
240 sigemptyset(&set); | 240 sigemptyset(&set); |
241 sigaddset(&set, SIGCHLD); | 241 sigaddset(&set, SIGCHLD); |
242 sigaddset(&set, SIGALRM); | |
243 sigaddset(&set, SIGINT); | |
242 sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL)); | 244 sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL)); |
243 sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL)); | 245 sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL)); |
244 sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL)); | 246 sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL)); |
245 sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL)); | 247 sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL)); |
246 sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); | 248 sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); |
247 sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL)); | 249 sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL)); |
248 | 250 |
249 sigemptyset(&wset); | |
250 | |
251 if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) { | 251 if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) { |
252 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 252 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
253 "sigprocmask() failed"); | 253 "sigprocmask() failed"); |
254 } | 254 } |
255 | 255 |
256 sigemptyset(&set); | |
257 | |
256 ngx_setproctitle("master process"); | 258 ngx_setproctitle("master process"); |
257 | 259 |
258 ngx_signal = 0; | |
259 ngx_new_binary = 0; | 260 ngx_new_binary = 0; |
260 delay = 0; | 261 delay = 0; |
261 signo = 0; | 262 signo = 0; |
262 live = 0; | 263 live = 0; |
263 | 264 |
265 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "new cycle"); | 266 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "new cycle"); |
266 | 267 |
267 if (ngx_process == NGX_PROCESS_MASTER) { | 268 if (ngx_process == NGX_PROCESS_MASTER) { |
268 ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL, | 269 ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL, |
269 "worker process", NGX_PROCESS_RESPAWN); | 270 "worker process", NGX_PROCESS_RESPAWN); |
271 | |
272 /* | |
273 * we have to limit the maximum life time of the worker processes | |
274 * by 1 month because our millisecond event timer is limited | |
275 * by 49 days on 32-bit platforms | |
276 */ | |
277 | |
278 itv.it_interval.tv_sec = 0; | |
279 itv.it_interval.tv_usec = 0; | |
280 itv.it_value.tv_sec = 30 * 24 * 60 * 60; | |
281 itv.it_value.tv_usec = 0; | |
282 | |
283 if (setitimer(ITIMER_REAL, &itv, NULL) == -1) { | |
284 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
285 "setitimer() failed"); | |
286 } | |
287 | |
270 live = 1; | 288 live = 1; |
271 | 289 |
272 } else { | 290 } else { |
273 ngx_init_temp_number(); | 291 ngx_init_temp_number(); |
274 | 292 |
293 | 311 |
294 for ( ;; ) { | 312 for ( ;; ) { |
295 | 313 |
296 if (ngx_process == NGX_PROCESS_MASTER) { | 314 if (ngx_process == NGX_PROCESS_MASTER) { |
297 if (delay) { | 315 if (delay) { |
298 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 316 delay *= 2; |
299 "temination cycle"); | 317 |
300 | 318 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
301 if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1) { | 319 "temination cycle: %d", delay); |
320 | |
321 itv.it_interval.tv_sec = 0; | |
322 itv.it_interval.tv_usec = 0; | |
323 itv.it_value.tv_sec = delay / 1000; | |
324 itv.it_value.tv_usec = (delay % 1000 ) * 1000; | |
325 | |
326 if (setitimer(ITIMER_REAL, &itv, NULL) == -1) { | |
302 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 327 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
303 "sigprocmask() failed"); | 328 "setitimer() failed"); |
304 continue; | |
305 } | 329 } |
306 | 330 } |
307 /* | 331 |
308 * there is very big chance that the pending signals | 332 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
309 * would be delivered right on the sigprocmask() return | 333 "sigsuspend"); |
310 */ | 334 |
311 | 335 sigsuspend(&set); |
312 if (!ngx_signal) { | 336 |
313 | 337 ngx_gettimeofday(&tv); |
314 delay *= 2; | 338 ngx_time_update(tv.tv_sec); |
315 | 339 |
316 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 340 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
317 "msleep %d", delay); | 341 "wake up"); |
318 | |
319 ngx_msleep(delay); | |
320 | |
321 ngx_gettimeofday(&tv); | |
322 ngx_time_update(tv.tv_sec); | |
323 | |
324 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
325 "wake up"); | |
326 } | |
327 | |
328 if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) { | |
329 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
330 "sigprocmask() failed"); | |
331 } | |
332 | |
333 ngx_signal = 0; | |
334 | |
335 } else { | |
336 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
337 "sigsuspend"); | |
338 | |
339 sigsuspend(&wset); | |
340 | |
341 ngx_gettimeofday(&tv); | |
342 ngx_time_update(tv.tv_sec); | |
343 | |
344 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
345 "wake up"); | |
346 } | |
347 | 342 |
348 } else { /* NGX_PROCESS_SINGLE */ | 343 } else { /* NGX_PROCESS_SINGLE */ |
349 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 344 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
350 "worker cycle"); | 345 "worker cycle"); |
351 | 346 |
428 } | 423 } |
429 | 424 |
430 } else if (ngx_quit) { | 425 } else if (ngx_quit) { |
431 signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL); | 426 signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL); |
432 | 427 |
428 } else if (ngx_timer) { | |
429 signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL); | |
430 | |
433 } else { | 431 } else { |
434 | 432 |
435 if (ngx_noaccept) { | 433 if (ngx_noaccept) { |
436 signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL); | 434 signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL); |
437 } | 435 } |
510 { | 508 { |
511 ngx_processes[i].exiting = 1; | 509 ngx_processes[i].exiting = 1; |
512 } | 510 } |
513 } | 511 } |
514 | 512 |
515 if (ngx_reopen || ngx_reconfigure) { | 513 if (ngx_reopen || ngx_reconfigure || ngx_timer) { |
516 break; | 514 break; |
517 } | 515 } |
518 } | 516 } |
519 | 517 |
520 if (ngx_reopen) { | 518 if (ngx_reopen) { |
521 ngx_reopen = 0; | 519 ngx_reopen = 0; |
520 | |
521 } else if (ngx_timer) { | |
522 ngx_timer = 0; | |
522 | 523 |
523 } else if (ngx_noaccept) { | 524 } else if (ngx_noaccept) { |
524 ngx_noaccept = 0; | 525 ngx_noaccept = 0; |
525 ngx_reconfigure = 0; | 526 ngx_reconfigure = 0; |
526 | 527 |