Mercurial > hg > nginx
comparison src/os/unix/ngx_process_cycle.c @ 322:ab2f8c9a2a45
nginx-0.0.3-2004-04-20-11:00:43 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 20 Apr 2004 07:00:43 +0000 |
parents | 56496082668b |
children | ba876b26b76d |
comparison
equal
deleted
inserted
replaced
321:32847588a82a | 322:ab2f8c9a2a45 |
---|---|
324 } | 324 } |
325 | 325 |
326 static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo) | 326 static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo) |
327 { | 327 { |
328 ngx_uint_t i; | 328 ngx_uint_t i; |
329 ngx_err_t err; | |
329 | 330 |
330 for (i = 0; i < ngx_last_process; i++) { | 331 for (i = 0; i < ngx_last_process; i++) { |
331 | 332 |
332 if (ngx_processes[i].detached) { | 333 if (ngx_processes[i].detached) { |
333 continue; | 334 continue; |
347 ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, | 348 ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, |
348 "kill (" PID_T_FMT ", %d)" , | 349 "kill (" PID_T_FMT ", %d)" , |
349 ngx_processes[i].pid, signo); | 350 ngx_processes[i].pid, signo); |
350 | 351 |
351 if (kill(ngx_processes[i].pid, signo) == -1) { | 352 if (kill(ngx_processes[i].pid, signo) == -1) { |
352 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 353 err = ngx_errno; |
354 ngx_log_error(NGX_LOG_ALERT, cycle->log, err, | |
353 "kill(%d, %d) failed", | 355 "kill(%d, %d) failed", |
354 ngx_processes[i].pid, signo); | 356 ngx_processes[i].pid, signo); |
357 | |
358 if (err == NGX_ESRCH) { | |
359 ngx_processes[i].exited = 1; | |
360 ngx_processes[i].exiting = 0; | |
361 ngx_reap = 1; | |
362 } | |
363 | |
355 continue; | 364 continue; |
356 } | 365 } |
357 | 366 |
358 if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { | 367 if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { |
359 ngx_processes[i].exiting = 1; | 368 ngx_processes[i].exiting = 1; |
366 { | 375 { |
367 ngx_delete_pidfile(cycle); | 376 ngx_delete_pidfile(cycle); |
368 | 377 |
369 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exit"); | 378 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exit"); |
370 | 379 |
380 ngx_destroy_pool(cycle->pool); | |
381 | |
371 exit(0); | 382 exit(0); |
372 } | 383 } |
373 | 384 |
374 | 385 |
375 static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) | 386 static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) |
376 { | 387 { |
377 sigset_t set; | 388 sigset_t set; |
378 ngx_uint_t i; | 389 ngx_uint_t i, exiting; |
379 ngx_listening_t *ls; | 390 ngx_listening_t *ls; |
380 ngx_core_conf_t *ccf; | 391 ngx_core_conf_t *ccf; |
381 #if (NGX_THREADS) | 392 #if (NGX_THREADS) |
382 ngx_tid_t tid; | 393 ngx_tid_t tid; |
383 #endif | 394 #endif |
461 } | 472 } |
462 } | 473 } |
463 | 474 |
464 #endif | 475 #endif |
465 | 476 |
477 exiting = 0; | |
478 | |
466 for ( ;; ) { | 479 for ( ;; ) { |
480 if (exiting && ngx_event_timer_rbtree == &ngx_event_timer_sentinel) { | |
481 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting"); | |
482 ngx_destroy_pool(cycle->pool); | |
483 exit(0); | |
484 } | |
485 | |
467 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); | 486 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); |
468 | 487 |
469 ngx_process_events(cycle); | 488 ngx_process_events(cycle); |
470 | 489 |
471 if (ngx_terminate) { | 490 if (ngx_terminate) { |
472 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting"); | 491 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting"); |
492 ngx_destroy_pool(cycle->pool); | |
473 exit(0); | 493 exit(0); |
474 } | 494 } |
475 | 495 |
476 if (ngx_quit) { | 496 if (ngx_quit) { |
477 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, | 497 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, |
478 "gracefully shutting down"); | 498 "gracefully shutting down"); |
479 ngx_setproctitle("worker process is shutting down"); | 499 ngx_setproctitle("worker process is shutting down"); |
480 break; | 500 |
481 } | 501 if (!exiting) { |
482 | 502 ngx_close_listening_sockets(cycle); |
483 if (ngx_reopen) { | 503 exiting = 1; |
484 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs"); | 504 } |
485 ngx_reopen_files(cycle, -1); | 505 } |
486 ngx_reopen = 0; | |
487 } | |
488 } | |
489 | |
490 ngx_close_listening_sockets(cycle); | |
491 | |
492 for ( ;; ) { | |
493 if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) { | |
494 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting"); | |
495 exit(0); | |
496 } | |
497 | |
498 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); | |
499 | |
500 ngx_process_events(cycle); | |
501 | 506 |
502 if (ngx_reopen) { | 507 if (ngx_reopen) { |
503 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs"); | 508 ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs"); |
504 ngx_reopen_files(cycle, -1); | 509 ngx_reopen_files(cycle, -1); |
505 ngx_reopen = 0; | 510 ngx_reopen = 0; |