Mercurial > hg > nginx-mail
comparison src/event/modules/ngx_kqueue_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 | 71c46860eb55 |
children | cf3d6edb3ad6 |
comparison
equal
deleted
inserted
replaced
105:531d62c2a28d | 106:45f7329b4bd0 |
---|---|
443 static ngx_int_t | 443 static ngx_int_t |
444 ngx_kqueue_process_events(ngx_cycle_t *cycle) | 444 ngx_kqueue_process_events(ngx_cycle_t *cycle) |
445 { | 445 { |
446 int events, n; | 446 int events, n; |
447 ngx_int_t i, instance; | 447 ngx_int_t i, instance; |
448 ngx_uint_t lock, accept_lock, expire; | 448 ngx_uint_t lock, accept_lock; |
449 ngx_err_t err; | 449 ngx_err_t err; |
450 ngx_msec_t timer; | 450 ngx_msec_t timer, delta; |
451 ngx_event_t *ev; | 451 ngx_event_t *ev; |
452 ngx_epoch_msec_t delta; | |
453 struct timeval tv; | 452 struct timeval tv; |
454 struct timespec ts, *tp; | 453 struct timespec ts, *tp; |
455 | 454 |
456 for ( ;; ) { | 455 timer = ngx_event_find_timer(); |
457 timer = ngx_event_find_timer(); | |
458 | 456 |
459 #if (NGX_THREADS) | 457 #if (NGX_THREADS) |
460 | 458 |
461 if (timer == NGX_TIMER_ERROR) { | 459 if (timer == NGX_TIMER_ERROR) { |
462 return NGX_ERROR; | 460 return NGX_ERROR; |
463 } | 461 } |
464 | 462 |
465 if (timer == NGX_TIMER_INFINITE || timer > 500) { | 463 if (timer == NGX_TIMER_INFINITE || timer > 500) { |
466 timer = 500; | 464 timer = 500; |
467 break; | 465 break; |
468 } | 466 } |
469 | 467 |
470 #endif | 468 #endif |
471 | 469 |
472 if (timer != 0) { | |
473 break; | |
474 } | |
475 | |
476 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
477 "kevent expired timer"); | |
478 | |
479 ngx_event_expire_timers((ngx_msec_t) | |
480 (ngx_elapsed_msec - ngx_old_elapsed_msec)); | |
481 | |
482 if (ngx_posted_events && ngx_threaded) { | |
483 ngx_wakeup_worker_thread(cycle); | |
484 } | |
485 } | |
486 | |
487 ngx_old_elapsed_msec = ngx_elapsed_msec; | |
488 expire = 1; | |
489 accept_lock = 0; | 470 accept_lock = 0; |
490 | 471 |
491 if (ngx_accept_mutex) { | 472 if (ngx_accept_mutex) { |
492 if (ngx_accept_disabled > 0) { | 473 if (ngx_accept_disabled > 0) { |
493 ngx_accept_disabled--; | 474 ngx_accept_disabled--; |
502 | 483 |
503 } else if (timer == NGX_TIMER_INFINITE | 484 } else if (timer == NGX_TIMER_INFINITE |
504 || timer > ngx_accept_mutex_delay) | 485 || timer > ngx_accept_mutex_delay) |
505 { | 486 { |
506 timer = ngx_accept_mutex_delay; | 487 timer = ngx_accept_mutex_delay; |
507 expire = 0; | |
508 } | 488 } |
509 } | 489 } |
510 } | 490 } |
511 | 491 |
512 if (ngx_threaded) { | 492 if (ngx_threaded) { |
522 nchanges = 0; | 502 nchanges = 0; |
523 } | 503 } |
524 | 504 |
525 if (timer == NGX_TIMER_INFINITE) { | 505 if (timer == NGX_TIMER_INFINITE) { |
526 tp = NULL; | 506 tp = NULL; |
527 expire = 0; | |
528 | 507 |
529 } else { | 508 } else { |
530 ts.tv_sec = timer / 1000; | 509 ts.tv_sec = timer / 1000; |
531 ts.tv_nsec = (timer % 1000) * 1000000; | 510 ts.tv_nsec = (timer % 1000) * 1000000; |
532 tp = &ts; | 511 tp = &ts; |
547 ngx_time_update(tv.tv_sec); | 526 ngx_time_update(tv.tv_sec); |
548 | 527 |
549 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 528 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
550 "kevent events: %d", events); | 529 "kevent events: %d", events); |
551 | 530 |
552 delta = ngx_elapsed_msec; | 531 delta = ngx_current_time; |
553 ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 | 532 ngx_current_time = (ngx_msec_t) tv.tv_sec * 1000 + tv.tv_usec / 1000; |
554 + tv.tv_usec / 1000 - ngx_start_msec; | |
555 | 533 |
556 if (err) { | 534 if (err) { |
557 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, | 535 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, |
558 cycle->log, err, "kevent() failed"); | 536 cycle->log, err, "kevent() failed"); |
559 ngx_accept_mutex_unlock(); | 537 ngx_accept_mutex_unlock(); |
560 return NGX_ERROR; | 538 return NGX_ERROR; |
561 } | 539 } |
562 | 540 |
563 if (timer != NGX_TIMER_INFINITE) { | 541 if (timer != NGX_TIMER_INFINITE) { |
564 delta = ngx_elapsed_msec - delta; | 542 delta = ngx_current_time - delta; |
565 | 543 |
566 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 544 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
567 "kevent timer: %d, delta: %d", timer, (int) delta); | 545 "kevent timer: %M, delta: %M", timer, delta); |
568 | 546 |
569 } else { | 547 } else { |
570 if (events == 0) { | 548 if (events == 0) { |
571 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, | 549 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, |
572 "kevent() returned no events without timeout"); | 550 "kevent() returned no events without timeout"); |
716 | 694 |
717 if (lock) { | 695 if (lock) { |
718 ngx_mutex_unlock(ngx_posted_events_mutex); | 696 ngx_mutex_unlock(ngx_posted_events_mutex); |
719 } | 697 } |
720 | 698 |
721 if (expire && delta) { | 699 ngx_event_expire_timers(); |
722 ngx_event_expire_timers((ngx_msec_t) delta); | |
723 } | |
724 | 700 |
725 if (ngx_posted_events) { | 701 if (ngx_posted_events) { |
726 if (ngx_threaded) { | 702 if (ngx_threaded) { |
727 ngx_wakeup_worker_thread(cycle); | 703 ngx_wakeup_worker_thread(cycle); |
728 | 704 |