Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2003-07-07 10:11:50 +0400
committerIgor Sysoev <igor@sysoev.ru>2003-07-07 10:11:50 +0400
commit9d639520aa95f0ff3882ea348d4347f69cbae493 (patch)
treea163ada230b77745dc9117df4a2a5dce756115cc /src/event/ngx_event_timer.c
parent340b03b201c77f394cc70fda4d960ad6c3b68905 (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.c48
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);
+ }
}