comparison src/event/modules/ngx_rtsig_module.c @ 106:45f7329b4bd0 NGINX_0_3_0

nginx 0.3.0 *) Change: the 10-days live time limit of worker process was eliminated. The limit was introduced because of millisecond timers overflow.
author Igor Sysoev <http://sysoev.ru>
date Fri, 07 Oct 2005 00:00:00 +0400
parents d6800bbe720e
children cf3d6edb3ad6
comparison
equal deleted inserted replaced
105:531d62c2a28d 106:45f7329b4bd0
281 static ngx_int_t 281 static ngx_int_t
282 ngx_rtsig_process_events(ngx_cycle_t *cycle) 282 ngx_rtsig_process_events(ngx_cycle_t *cycle)
283 { 283 {
284 int signo; 284 int signo;
285 ngx_int_t instance; 285 ngx_int_t instance;
286 ngx_uint_t expire; 286 ngx_msec_t timer, delta;
287 ngx_msec_t timer;
288 ngx_err_t err; 287 ngx_err_t err;
289 siginfo_t si; 288 siginfo_t si;
290 ngx_event_t *rev, *wev; 289 ngx_event_t *rev, *wev;
291 struct timeval tv; 290 struct timeval tv;
292 struct timespec ts, *tp; 291 struct timespec ts, *tp;
293 struct sigaction sa; 292 struct sigaction sa;
294 ngx_epoch_msec_t delta;
295 ngx_connection_t *c; 293 ngx_connection_t *c;
296 ngx_rtsig_conf_t *rtscf; 294 ngx_rtsig_conf_t *rtscf;
297 295
298 if (overflow) { 296 if (overflow) {
299 timer = 0; 297 timer = 0;
300 expire = 0;
301 298
302 } else { 299 } else {
303 for ( ;; ) { 300 timer = ngx_event_find_timer();
304 timer = ngx_event_find_timer();
305 301
306 #if (NGX_THREADS) 302 #if (NGX_THREADS)
307 303
308 if (timer == NGX_TIMER_ERROR) { 304 if (timer == NGX_TIMER_ERROR) {
309 return NGX_ERROR; 305 return NGX_ERROR;
310 } 306 }
311 307
312 if (timer == NGX_TIMER_INFINITE || timer > 500) { 308 if (timer == NGX_TIMER_INFINITE || timer > 500) {
313 timer = 500; 309 timer = 500;
314 break; 310 break;
315 } 311 }
316 312
317 #endif 313 #endif
318
319 if (timer != 0) {
320 break;
321 }
322
323 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
324 "rtsig expired timer");
325
326 ngx_event_expire_timers((ngx_msec_t)
327 (ngx_elapsed_msec - ngx_old_elapsed_msec));
328
329 if (ngx_posted_events && ngx_threaded) {
330 ngx_wakeup_worker_thread(cycle);
331 }
332 }
333
334 expire = 1;
335 314
336 if (ngx_accept_mutex) { 315 if (ngx_accept_mutex) {
337 if (ngx_accept_disabled > 0) { 316 if (ngx_accept_disabled > 0) {
338 ngx_accept_disabled--; 317 ngx_accept_disabled--;
339 318
347 if (ngx_accept_mutex_held == 0 326 if (ngx_accept_mutex_held == 0
348 && (timer == NGX_TIMER_INFINITE 327 && (timer == NGX_TIMER_INFINITE
349 || timer > ngx_accept_mutex_delay)) 328 || timer > ngx_accept_mutex_delay))
350 { 329 {
351 timer = ngx_accept_mutex_delay; 330 timer = ngx_accept_mutex_delay;
352 expire = 0;
353 } 331 }
354 } 332 }
355 } 333 }
356 } 334 }
357 335
358 if (timer == NGX_TIMER_INFINITE) { 336 if (timer == NGX_TIMER_INFINITE) {
359 tp = NULL; 337 tp = NULL;
360 expire = 0;
361 338
362 } else { 339 } else {
363 ts.tv_sec = timer / 1000; 340 ts.tv_sec = timer / 1000;
364 ts.tv_nsec = (timer % 1000) * 1000000; 341 ts.tv_nsec = (timer % 1000) * 1000000;
365 tp = &ts; 342 tp = &ts;
366 } 343 }
367 344
368 ngx_old_elapsed_msec = ngx_elapsed_msec;
369
370 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, 345 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
371 "rtsig timer: %d", timer); 346 "rtsig timer: %M", timer);
372 347
373 /* Linux's sigwaitinfo() is sigtimedwait() with the NULL timeout pointer */ 348 /* Linux's sigwaitinfo() is sigtimedwait() with the NULL timeout pointer */
374 349
375 signo = sigtimedwait(&set, &si, tp); 350 signo = sigtimedwait(&set, &si, tp);
376 351
400 } 375 }
401 376
402 ngx_gettimeofday(&tv); 377 ngx_gettimeofday(&tv);
403 ngx_time_update(tv.tv_sec); 378 ngx_time_update(tv.tv_sec);
404 379
405 delta = ngx_elapsed_msec; 380 delta = ngx_current_time;
406 ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 381 ngx_current_time = (ngx_msec_t) tv.tv_sec * 1000 + tv.tv_usec / 1000;
407 + tv.tv_usec / 1000 - ngx_start_msec;
408 382
409 if (err) { 383 if (err) {
410 ngx_accept_mutex_unlock(); 384 ngx_accept_mutex_unlock();
411 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, 385 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
412 cycle->log, err, "sigtimedwait() failed"); 386 cycle->log, err, "sigtimedwait() failed");
413 return NGX_ERROR; 387 return NGX_ERROR;
414 } 388 }
415 389
416 if (timer != NGX_TIMER_INFINITE) { 390 if (timer != NGX_TIMER_INFINITE) {
417 delta = ngx_elapsed_msec - delta; 391 delta = ngx_current_time - delta;
418 392
419 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, 393 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
420 "rtsig timer: %d, delta: %d", timer, (int) delta); 394 "rtsig timer: %M, delta: %M", timer, delta);
421 } 395 }
422 396
423 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); 397 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module);
424 398
425 if (signo == rtscf->signo || signo == rtscf->signo + 1) { 399 if (signo == rtscf->signo || signo == rtscf->signo + 1) {
555 return NGX_ERROR; 529 return NGX_ERROR;
556 } 530 }
557 531
558 ngx_accept_mutex_unlock(); 532 ngx_accept_mutex_unlock();
559 533
560 if (expire && delta) { 534 ngx_event_expire_timers();
561 ngx_event_expire_timers((ngx_msec_t) delta);
562 }
563 535
564 if (ngx_posted_events) { 536 if (ngx_posted_events) {
565 if (ngx_threaded) { 537 if (ngx_threaded) {
566 ngx_wakeup_worker_thread(cycle); 538 ngx_wakeup_worker_thread(cycle);
567 539