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