Mercurial > hg > nginx
comparison src/os/unix/ngx_process_cycle.c @ 365:fd24ba70e1b3
nginx-0.0.7-2004-06-23-09:54:27 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 23 Jun 2004 05:54:27 +0000 |
parents | 7650aea1816f |
children | e411b1482ee3 |
comparison
equal
deleted
inserted
replaced
364:7c54d93f5965 | 365:fd24ba70e1b3 |
---|---|
7 | 7 |
8 | 8 |
9 static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, | 9 static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, |
10 ngx_int_t type); | 10 ngx_int_t type); |
11 static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo); | 11 static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo); |
12 static ngx_uint_t ngx_reap_childs(ngx_cycle_t *cycle); | |
12 static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx); | 13 static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx); |
13 static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data); | 14 static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data); |
14 static void ngx_channel_handler(ngx_event_t *ev); | 15 static void ngx_channel_handler(ngx_event_t *ev); |
15 #if (NGX_THREADS) | 16 #if (NGX_THREADS) |
16 static int ngx_worker_thread_cycle(void *data); | 17 static int ngx_worker_thread_cycle(void *data); |
45 void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) | 46 void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) |
46 { | 47 { |
47 char *title; | 48 char *title; |
48 u_char *p; | 49 u_char *p; |
49 size_t size; | 50 size_t size; |
50 ngx_int_t n, i; | 51 ngx_int_t i; |
51 sigset_t set; | 52 sigset_t set; |
52 struct timeval tv; | 53 struct timeval tv; |
53 struct itimerval itv; | 54 struct itimerval itv; |
54 ngx_uint_t live; | 55 ngx_uint_t live; |
55 ngx_msec_t delay; | 56 ngx_msec_t delay; |
75 sigemptyset(&set); | 76 sigemptyset(&set); |
76 | 77 |
77 | 78 |
78 size = sizeof(master_process); | 79 size = sizeof(master_process); |
79 | 80 |
80 for (n = 0; n < ctx->argc; n++) { | 81 for (i = 0; i < ctx->argc; i++) { |
81 size += ngx_strlen(ctx->argv[n]) + 1; | 82 size += ngx_strlen(ctx->argv[i]) + 1; |
82 } | 83 } |
83 | 84 |
84 title = ngx_palloc(cycle->pool, size); | 85 title = ngx_palloc(cycle->pool, size); |
85 | 86 |
86 p = ngx_cpymem(title, master_process, sizeof(master_process) - 1); | 87 p = ngx_cpymem(title, master_process, sizeof(master_process) - 1); |
87 for (n = 0; n < ctx->argc; n++) { | 88 for (i = 0; i < ctx->argc; i++) { |
88 *p++ = ' '; | 89 *p++ = ' '; |
89 p = ngx_cpystrn(p, (u_char *) ctx->argv[n], size); | 90 p = ngx_cpystrn(p, (u_char *) ctx->argv[i], size); |
90 } | 91 } |
91 | 92 |
92 ngx_setproctitle(title); | 93 ngx_setproctitle(title); |
93 | 94 |
94 | 95 |
130 | 131 |
131 if (ngx_reap) { | 132 if (ngx_reap) { |
132 ngx_reap = 0; | 133 ngx_reap = 0; |
133 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap childs"); | 134 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap childs"); |
134 | 135 |
135 live = 0; | 136 live = ngx_reap_childs(cycle); |
136 for (i = 0; i < ngx_last_process; i++) { | |
137 | |
138 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
139 "child: " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d", | |
140 ngx_processes[i].pid, | |
141 ngx_processes[i].exiting, | |
142 ngx_processes[i].exited, | |
143 ngx_processes[i].detached, | |
144 ngx_processes[i].respawn, | |
145 ngx_processes[i].just_respawn); | |
146 | |
147 if (ngx_processes[i].exited) { | |
148 | |
149 if (ngx_processes[i].respawn | |
150 && !ngx_processes[i].exiting | |
151 && !ngx_terminate | |
152 && !ngx_quit) | |
153 { | |
154 if (ngx_spawn_process(cycle, ngx_processes[i].proc, | |
155 ngx_processes[i].data, | |
156 ngx_processes[i].name, i) | |
157 == NGX_ERROR) | |
158 { | |
159 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
160 "can not respawn %s", | |
161 ngx_processes[i].name); | |
162 continue; | |
163 } | |
164 | |
165 live = 1; | |
166 | |
167 continue; | |
168 } | |
169 | |
170 if (ngx_processes[i].pid == ngx_new_binary) { | |
171 ngx_new_binary = 0; | |
172 if (ngx_noaccepting) { | |
173 ngx_restart = 1; | |
174 ngx_noaccepting = 0; | |
175 } | |
176 } | |
177 | |
178 if (i != --ngx_last_process) { | |
179 ngx_processes[i--] = ngx_processes[ngx_last_process]; | |
180 } | |
181 | |
182 } else if (ngx_processes[i].exiting | |
183 || !ngx_processes[i].detached) | |
184 { | |
185 live = 1; | |
186 } | |
187 } | |
188 } | 137 } |
189 | 138 |
190 if (!live && (ngx_terminate || ngx_quit)) { | 139 if (!live && (ngx_terminate || ngx_quit)) { |
191 ngx_master_exit(cycle, ctx); | 140 ngx_master_exit(cycle, ctx); |
192 } | 141 } |
350 ch.slot = ngx_process_slot; | 299 ch.slot = ngx_process_slot; |
351 ch.fd = ngx_processes[ngx_process_slot].channel[0]; | 300 ch.fd = ngx_processes[ngx_process_slot].channel[0]; |
352 | 301 |
353 for (i = 0; i < ngx_last_process - 1; i++) { | 302 for (i = 0; i < ngx_last_process - 1; i++) { |
354 | 303 |
355 ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0, | 304 ngx_log_debug4(NGX_LOG_DEBUG_CORE, cycle->log, 0, |
356 "pass channel s: %d pid:" PID_T_FMT " fd:%d", | 305 "pass channel s: %d pid:" PID_T_FMT " fd:%d to:" |
357 ch.slot, ch.pid, ch.fd); | 306 PID_T_FMT, ch.slot, ch.pid, ch.fd, ngx_processes[i].pid); |
358 | 307 |
359 /* TODO: NGX_AGAIN */ | 308 /* TODO: NGX_AGAIN */ |
360 | 309 |
361 ngx_write_channel(ngx_processes[i].channel[0], | 310 ngx_write_channel(ngx_processes[i].channel[0], |
362 &ch, sizeof(ngx_channel_t), cycle->log); | 311 &ch, sizeof(ngx_channel_t), cycle->log); |
459 | 408 |
460 if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { | 409 if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { |
461 ngx_processes[i].exiting = 1; | 410 ngx_processes[i].exiting = 1; |
462 } | 411 } |
463 } | 412 } |
413 } | |
414 | |
415 | |
416 static ngx_uint_t ngx_reap_childs(ngx_cycle_t *cycle) | |
417 { | |
418 ngx_int_t i, n; | |
419 ngx_uint_t live; | |
420 ngx_channel_t ch; | |
421 | |
422 ch.command = NGX_CMD_CLOSE_CHANNEL; | |
423 ch.fd = -1; | |
424 | |
425 live = 0; | |
426 for (i = 0; i < ngx_last_process; i++) { | |
427 | |
428 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
429 "child: " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d", | |
430 ngx_processes[i].pid, | |
431 ngx_processes[i].exiting, | |
432 ngx_processes[i].exited, | |
433 ngx_processes[i].detached, | |
434 ngx_processes[i].respawn, | |
435 ngx_processes[i].just_respawn); | |
436 | |
437 if (ngx_processes[i].exited) { | |
438 | |
439 if (!ngx_processes[i].detached) { | |
440 ngx_close_channel(ngx_processes[i].channel, cycle->log); | |
441 | |
442 ngx_processes[i].channel[0] = -1; | |
443 ngx_processes[i].channel[1] = -1; | |
444 | |
445 ch.pid = ngx_processes[i].pid; | |
446 ch.slot = i; | |
447 | |
448 for (n = 0; n < ngx_last_process; n++) { | |
449 if (ngx_processes[n].exited | |
450 || ngx_processes[n].channel[0] == -1) | |
451 { | |
452 continue; | |
453 } | |
454 | |
455 ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0, | |
456 "pass close channel s: %d pid:" PID_T_FMT | |
457 " to:" PID_T_FMT, ch.slot, ch.pid, ngx_processes[n].pid); | |
458 | |
459 /* TODO: NGX_AGAIN */ | |
460 | |
461 ngx_write_channel(ngx_processes[n].channel[0], | |
462 &ch, sizeof(ngx_channel_t), cycle->log); | |
463 } | |
464 } | |
465 | |
466 if (ngx_processes[i].respawn | |
467 && !ngx_processes[i].exiting | |
468 && !ngx_terminate | |
469 && !ngx_quit) | |
470 { | |
471 if (ngx_spawn_process(cycle, ngx_processes[i].proc, | |
472 ngx_processes[i].data, | |
473 ngx_processes[i].name, i) | |
474 == NGX_ERROR) | |
475 { | |
476 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | |
477 "can not respawn %s", ngx_processes[i].name); | |
478 continue; | |
479 } | |
480 | |
481 live = 1; | |
482 | |
483 continue; | |
484 } | |
485 | |
486 if (ngx_processes[i].pid == ngx_new_binary) { | |
487 ngx_new_binary = 0; | |
488 if (ngx_noaccepting) { | |
489 ngx_restart = 1; | |
490 ngx_noaccepting = 0; | |
491 } | |
492 } | |
493 | |
494 if (i != --ngx_last_process) { | |
495 ngx_processes[i--] = ngx_processes[ngx_last_process]; | |
496 } | |
497 | |
498 } else if (ngx_processes[i].exiting || !ngx_processes[i].detached) { | |
499 live = 1; | |
500 } | |
501 } | |
502 | |
503 return live; | |
464 } | 504 } |
465 | 505 |
466 | 506 |
467 static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) | 507 static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) |
468 { | 508 { |
710 ch.slot, ch.pid, ch.fd); | 750 ch.slot, ch.pid, ch.fd); |
711 | 751 |
712 ngx_processes[ch.slot].pid = ch.pid; | 752 ngx_processes[ch.slot].pid = ch.pid; |
713 ngx_processes[ch.slot].channel[0] = ch.fd; | 753 ngx_processes[ch.slot].channel[0] = ch.fd; |
714 break; | 754 break; |
755 | |
756 case NGX_CMD_CLOSE_CHANNEL: | |
757 | |
758 ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0, | |
759 "close channel s:%d pid:" PID_T_FMT " our:" PID_T_FMT | |
760 " fd:%d", | |
761 ch.slot, ch.pid, ngx_processes[ch.slot].pid, | |
762 ngx_processes[ch.slot].channel[0]); | |
763 | |
764 if (close(ngx_processes[ch.slot].channel[0]) == -1) { | |
765 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "close() failed"); | |
766 } | |
767 | |
768 ngx_processes[ch.slot].channel[0] = -1; | |
769 break; | |
715 } | 770 } |
716 } | 771 } |
717 | 772 |
718 | 773 |
719 #if (NGX_THREADS) | 774 #if (NGX_THREADS) |