Mercurial > hg > nginx-quic
diff src/event/ngx_event_timer.c @ 114:ac69ab96328d
nginx-0.0.1-2003-07-07-10:11:50 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 07 Jul 2003 06:11:50 +0000 |
parents | d7f606e25b99 |
children | cd54bcbaf3b5 |
line wrap: on
line diff
--- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -4,9 +4,10 @@ #include <ngx_event.h> -static ngx_event_t *ngx_timer_queue; +static ngx_event_t *ngx_timer_queue, ngx_temp_timer_queue; static int ngx_timer_cur_queue; static int ngx_timer_queue_num; +static int ngx_expire_timers; int ngx_event_timer_init(ngx_cycle_t *cycle) @@ -43,10 +44,13 @@ int ngx_event_timer_init(ngx_cycle_t *cy } else if (ngx_timer_queue_num > ecf->timer_queues) { /* STUB */ - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY"); + ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: timer"); exit(1); } + ngx_temp_timer_queue.timer_prev = &ngx_temp_timer_queue; + ngx_temp_timer_queue.timer_next = &ngx_temp_timer_queue; + return NGX_OK;; } @@ -61,7 +65,7 @@ void ngx_event_timer_done(ngx_cycle_t *c void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) { - ngx_event_t *e; + ngx_event_t *e, *queue; #if (NGX_DEBUG_EVENT) ngx_connection_t *c = ev->data; @@ -74,18 +78,24 @@ void ngx_event_add_timer(ngx_event_t *ev return; } - for (e = ngx_timer_queue[ngx_timer_cur_queue].timer_next; - e != &ngx_timer_queue[ngx_timer_cur_queue] && timer > e->timer_delta; + if (ngx_expire_timers) { + queue = &ngx_temp_timer_queue; + + } else { + queue = &ngx_timer_queue[ngx_timer_cur_queue++]; + + if (ngx_timer_cur_queue >= ngx_timer_queue_num) { + ngx_timer_cur_queue = 0; + } + } + + for (e = queue->timer_next; + e != queue && timer > e->timer_delta; e = e->timer_next) { timer -= e->timer_delta; } - ngx_timer_cur_queue++; - if (ngx_timer_cur_queue >= ngx_timer_queue_num) { - ngx_timer_cur_queue = 0; - } - ev->timer_delta = timer; ev->timer_next = e; @@ -127,6 +137,8 @@ void ngx_event_expire_timers(ngx_msec_t ngx_msec_t delta; ngx_event_t *ev; + ngx_expire_timers = 1; + for (i = 0; i < ngx_timer_queue_num; i++) { delta = timer; @@ -161,4 +173,20 @@ void ngx_event_expire_timers(ngx_msec_t ev->event_handler(ev); } } + + ngx_expire_timers = 0; + + if (ngx_temp_timer_queue.timer_next == &ngx_temp_timer_queue) { + return; + } + + timer = 0; + + while (ngx_temp_timer_queue.timer_next != &ngx_temp_timer_queue) { + timer += ngx_temp_timer_queue.timer_next->timer_delta; + ev = ngx_temp_timer_queue.timer_next; + + ngx_del_timer(ev); + ngx_add_timer(ev, timer); + } }