comparison 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
comparison
equal deleted inserted replaced
113:d7f606e25b99 114:ac69ab96328d
2 #include <ngx_config.h> 2 #include <ngx_config.h>
3 #include <ngx_core.h> 3 #include <ngx_core.h>
4 #include <ngx_event.h> 4 #include <ngx_event.h>
5 5
6 6
7 static ngx_event_t *ngx_timer_queue; 7 static ngx_event_t *ngx_timer_queue, ngx_temp_timer_queue;
8 static int ngx_timer_cur_queue; 8 static int ngx_timer_cur_queue;
9 static int ngx_timer_queue_num; 9 static int ngx_timer_queue_num;
10 static int ngx_expire_timers;
10 11
11 12
12 int ngx_event_timer_init(ngx_cycle_t *cycle) 13 int ngx_event_timer_init(ngx_cycle_t *cycle)
13 { 14 {
14 int i; 15 int i;
41 ngx_timer_queue[i].timer_next = &ngx_timer_queue[i]; 42 ngx_timer_queue[i].timer_next = &ngx_timer_queue[i];
42 } 43 }
43 44
44 } else if (ngx_timer_queue_num > ecf->timer_queues) { 45 } else if (ngx_timer_queue_num > ecf->timer_queues) {
45 /* STUB */ 46 /* STUB */
46 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY"); 47 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: timer");
47 exit(1); 48 exit(1);
48 } 49 }
50
51 ngx_temp_timer_queue.timer_prev = &ngx_temp_timer_queue;
52 ngx_temp_timer_queue.timer_next = &ngx_temp_timer_queue;
49 53
50 return NGX_OK;; 54 return NGX_OK;;
51 } 55 }
52 56
53 57
59 } 63 }
60 64
61 65
62 void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) 66 void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)
63 { 67 {
64 ngx_event_t *e; 68 ngx_event_t *e, *queue;
65 69
66 #if (NGX_DEBUG_EVENT) 70 #if (NGX_DEBUG_EVENT)
67 ngx_connection_t *c = ev->data; 71 ngx_connection_t *c = ev->data;
68 ngx_log_debug(ev->log, "set timer: %d:%d, slot: %d" _ 72 ngx_log_debug(ev->log, "set timer: %d:%d, slot: %d" _
69 c->fd _ timer _ ngx_timer_cur_queue); 73 c->fd _ timer _ ngx_timer_cur_queue);
72 if (ev->timer_next || ev->timer_prev) { 76 if (ev->timer_next || ev->timer_prev) {
73 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); 77 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set");
74 return; 78 return;
75 } 79 }
76 80
77 for (e = ngx_timer_queue[ngx_timer_cur_queue].timer_next; 81 if (ngx_expire_timers) {
78 e != &ngx_timer_queue[ngx_timer_cur_queue] && timer > e->timer_delta; 82 queue = &ngx_temp_timer_queue;
83
84 } else {
85 queue = &ngx_timer_queue[ngx_timer_cur_queue++];
86
87 if (ngx_timer_cur_queue >= ngx_timer_queue_num) {
88 ngx_timer_cur_queue = 0;
89 }
90 }
91
92 for (e = queue->timer_next;
93 e != queue && timer > e->timer_delta;
79 e = e->timer_next) 94 e = e->timer_next)
80 { 95 {
81 timer -= e->timer_delta; 96 timer -= e->timer_delta;
82 }
83
84 ngx_timer_cur_queue++;
85 if (ngx_timer_cur_queue >= ngx_timer_queue_num) {
86 ngx_timer_cur_queue = 0;
87 } 97 }
88 98
89 ev->timer_delta = timer; 99 ev->timer_delta = timer;
90 100
91 ev->timer_next = e; 101 ev->timer_next = e;
125 { 135 {
126 int i; 136 int i;
127 ngx_msec_t delta; 137 ngx_msec_t delta;
128 ngx_event_t *ev; 138 ngx_event_t *ev;
129 139
140 ngx_expire_timers = 1;
141
130 for (i = 0; i < ngx_timer_queue_num; i++) { 142 for (i = 0; i < ngx_timer_queue_num; i++) {
131 143
132 delta = timer; 144 delta = timer;
133 145
134 for ( ;; ) { 146 for ( ;; ) {
159 } 171 }
160 172
161 ev->event_handler(ev); 173 ev->event_handler(ev);
162 } 174 }
163 } 175 }
176
177 ngx_expire_timers = 0;
178
179 if (ngx_temp_timer_queue.timer_next == &ngx_temp_timer_queue) {
180 return;
181 }
182
183 timer = 0;
184
185 while (ngx_temp_timer_queue.timer_next != &ngx_temp_timer_queue) {
186 timer += ngx_temp_timer_queue.timer_next->timer_delta;
187 ev = ngx_temp_timer_queue.timer_next;
188
189 ngx_del_timer(ev);
190 ngx_add_timer(ev, timer);
191 }
164 } 192 }