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)