diff options
author | Igor Sysoev <igor@sysoev.ru> | 2003-07-07 10:11:50 +0400 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2003-07-07 10:11:50 +0400 |
commit | 9d639520aa95f0ff3882ea348d4347f69cbae493 (patch) | |
tree | a163ada230b77745dc9117df4a2a5dce756115cc /src/event/ngx_event_timer.c | |
parent | 340b03b201c77f394cc70fda4d960ad6c3b68905 (diff) |
nginx-0.0.1-2003-07-07-10:11:50 import
Diffstat (limited to 'src/event/ngx_event_timer.c')
-rw-r--r-- | src/event/ngx_event_timer.c | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c index 412298312..e6bec42ee 100644 --- 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 *cycle) } 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 *cycle) 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, ngx_msec_t timer) 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 timer) 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 timer) 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); + } } |