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);
+    }
 }