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