Mercurial > hg > nginx
comparison src/event/ngx_event_timer.c @ 210:00cafae0bdf1
nginx-0.0.1-2003-12-14-23:10:27 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 14 Dec 2003 20:10:27 +0000 |
parents | e1c815be05ae |
children | 679f60139863 |
comparison
equal
deleted
inserted
replaced
209:e1c815be05ae | 210:00cafae0bdf1 |
---|---|
1 | 1 |
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 | |
6 | |
7 /* | |
8 * TODO: in multithreaded enviroment all timer operations must be | |
9 * protected by the single mutex | |
10 */ | |
5 | 11 |
6 | 12 |
7 ngx_rbtree_t *ngx_event_timer_rbtree; | 13 ngx_rbtree_t *ngx_event_timer_rbtree; |
8 ngx_rbtree_t ngx_event_timer_sentinel; | 14 ngx_rbtree_t ngx_event_timer_sentinel; |
9 | 15 |
37 if (node == &ngx_event_timer_sentinel) { | 43 if (node == &ngx_event_timer_sentinel) { |
38 return 0; | 44 return 0; |
39 | 45 |
40 } else { | 46 } else { |
41 return (ngx_msec_t) | 47 return (ngx_msec_t) |
48 (node->key * NGX_TIMER_RESOLUTION - | |
49 ngx_elapsed_msec / NGX_TIMER_RESOLUTION * NGX_TIMER_RESOLUTION); | |
50 #if 0 | |
42 (node->key * NGX_TIMER_RESOLUTION - ngx_elapsed_msec); | 51 (node->key * NGX_TIMER_RESOLUTION - ngx_elapsed_msec); |
52 #endif | |
43 } | 53 } |
44 } | 54 } |
45 | 55 |
46 | 56 |
47 void ngx_event_expire_timers(ngx_msec_t timer) | 57 void ngx_event_expire_timers(ngx_msec_t timer) |
80 } | 90 } |
81 | 91 |
82 break; | 92 break; |
83 } | 93 } |
84 } | 94 } |
85 | |
86 | |
87 #if 0 | |
88 | |
89 /* TODO: in multithreaded enviroment all timer operations must be | |
90 protected by the single mutex */ | |
91 | |
92 | |
93 #if 0 | |
94 static ngx_event_t *ngx_timer_queue, ngx_temp_timer_queue; | |
95 static int ngx_expire_timers; | |
96 #endif | |
97 | |
98 static ngx_event_t *ngx_timer_queue; | |
99 static ngx_msec_t *ngx_timer_delta; | |
100 static int ngx_timer_cur_queue; | |
101 static int ngx_timer_queue_num; | |
102 | |
103 | |
104 int ngx_event_timer_init(ngx_cycle_t *cycle) | |
105 { | |
106 ngx_int_t i; | |
107 ngx_msec_t *new_delta; | |
108 ngx_event_t *new_queue; | |
109 ngx_event_conf_t *ecf; | |
110 | |
111 ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); | |
112 | |
113 if (ngx_timer_queue_num < ecf->timer_queues) { | |
114 ngx_test_null(new_queue, | |
115 ngx_alloc(ecf->timer_queues * sizeof(ngx_event_t), | |
116 cycle->log), | |
117 NGX_ERROR); | |
118 | |
119 for (i = 0; i < ngx_timer_queue_num; i++) { | |
120 new_queue[i] = ngx_timer_queue[i]; | |
121 } | |
122 | |
123 if (ngx_timer_queue) { | |
124 ngx_free(ngx_timer_queue); | |
125 } | |
126 | |
127 ngx_timer_queue = new_queue; | |
128 | |
129 ngx_test_null(new_delta, | |
130 ngx_calloc(ecf->timer_queues * sizeof(ngx_msec_t), | |
131 cycle->log), | |
132 NGX_ERROR); | |
133 | |
134 for (i = 0; i < ngx_timer_queue_num; i++) { | |
135 new_delta[i] = ngx_timer_delta[i]; | |
136 } | |
137 | |
138 if (ngx_timer_delta) { | |
139 ngx_free(ngx_timer_delta); | |
140 } | |
141 | |
142 ngx_timer_delta = new_delta; | |
143 | |
144 ngx_timer_queue_num = ecf->timer_queues; | |
145 ngx_timer_cur_queue = 0; | |
146 | |
147 for (/* void */; i < ngx_timer_queue_num; i++) { | |
148 ngx_timer_queue[i].timer_prev = &ngx_timer_queue[i]; | |
149 ngx_timer_queue[i].timer_next = &ngx_timer_queue[i]; | |
150 } | |
151 | |
152 } else if (ngx_timer_queue_num > ecf->timer_queues) { | |
153 /* STUB */ | |
154 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: timer"); | |
155 exit(1); | |
156 } | |
157 | |
158 #if 0 | |
159 ngx_temp_timer_queue.timer_prev = &ngx_temp_timer_queue; | |
160 ngx_temp_timer_queue.timer_next = &ngx_temp_timer_queue; | |
161 #endif | |
162 | |
163 return NGX_OK;; | |
164 } | |
165 | |
166 | |
167 void ngx_event_timer_done(ngx_cycle_t *cycle) | |
168 { | |
169 ngx_free(ngx_timer_queue); | |
170 ngx_timer_queue = NULL; | |
171 | |
172 ngx_free(ngx_timer_delta); | |
173 ngx_timer_delta = NULL; | |
174 | |
175 ngx_timer_queue_num = 0; | |
176 } | |
177 | |
178 | |
179 void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) | |
180 { | |
181 ngx_event_t *e, *queue; | |
182 #if (NGX_DEBUG_EVENT) | |
183 ngx_connection_t *c; | |
184 #endif | |
185 | |
186 if (ev->timer_set) { | |
187 ngx_del_timer(ev); | |
188 } | |
189 | |
190 #if (NGX_DEBUG_EVENT) | |
191 c = ev->data; | |
192 ngx_log_debug(ev->log, "set timer: %d:%d:%d, slot: %d" _ | |
193 c->fd _ ev->write _ timer _ ngx_timer_cur_queue); | |
194 #endif | |
195 | |
196 if (ev->timer_next || ev->timer_prev) { | |
197 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); | |
198 return; | |
199 } | |
200 | |
201 queue = &ngx_timer_queue[ngx_timer_cur_queue]; | |
202 timer += ngx_timer_delta[ngx_timer_cur_queue++]; | |
203 | |
204 if (ngx_timer_cur_queue >= ngx_timer_queue_num) { | |
205 ngx_timer_cur_queue = 0; | |
206 } | |
207 | |
208 | |
209 #if 0 | |
210 if (ngx_expire_timers) { | |
211 queue = &ngx_temp_timer_queue; | |
212 | |
213 } else { | |
214 queue = &ngx_timer_queue[ngx_timer_cur_queue++]; | |
215 | |
216 if (ngx_timer_cur_queue >= ngx_timer_queue_num) { | |
217 ngx_timer_cur_queue = 0; | |
218 } | |
219 } | |
220 #endif | |
221 | |
222 for (e = queue->timer_next; | |
223 e != queue && timer > e->timer_delta; | |
224 e = e->timer_next) | |
225 { | |
226 timer -= e->timer_delta; | |
227 } | |
228 | |
229 ev->timer_delta = timer; | |
230 | |
231 ev->timer_next = e; | |
232 ev->timer_prev = e->timer_prev; | |
233 | |
234 e->timer_prev->timer_next = ev; | |
235 e->timer_prev = ev; | |
236 | |
237 ev->timer_set = 1; | |
238 | |
239 return; | |
240 } | |
241 | |
242 | |
243 int ngx_event_find_timer(void) | |
244 { | |
245 ngx_int_t i; | |
246 ngx_msec_t timer; | |
247 | |
248 timer = NGX_MAX_MSEC; | |
249 | |
250 for (i = 0; i < ngx_timer_queue_num; i++) { | |
251 if (ngx_timer_queue[i].timer_next == &ngx_timer_queue[i]) { | |
252 continue; | |
253 } | |
254 | |
255 if (timer > ngx_timer_queue[i].timer_next->timer_delta) { | |
256 timer = ngx_timer_queue[i].timer_next->timer_delta; | |
257 } | |
258 } | |
259 | |
260 if (timer == NGX_MAX_MSEC) { | |
261 return 0; | |
262 } | |
263 | |
264 return timer; | |
265 } | |
266 | |
267 | |
268 void ngx_event_set_timer_delta(ngx_msec_t timer) | |
269 { | |
270 ngx_int_t i; | |
271 | |
272 for (i = 0; i < ngx_timer_queue_num; i++) { | |
273 ngx_timer_delta[i] = timer; | |
274 } | |
275 } | |
276 | |
277 | |
278 /* void ngx_event_expire_timers() */ | |
279 void ngx_event_expire_timers(ngx_msec_t timer) | |
280 { | |
281 ngx_int_t i; | |
282 #if 0 | |
283 ngx_msec_t delta; | |
284 #endif | |
285 ngx_event_t *ev; | |
286 | |
287 #if 0 | |
288 ngx_expire_timers = 1; | |
289 #endif | |
290 | |
291 for (i = 0; i < ngx_timer_queue_num; i++) { | |
292 | |
293 #if 0 | |
294 delta = timer; | |
295 #endif | |
296 | |
297 for ( ;; ) { | |
298 ev = ngx_timer_queue[i].timer_next; | |
299 | |
300 if (ev == &ngx_timer_queue[i]) { | |
301 break; | |
302 } | |
303 | |
304 if (ev->timer_delta > ngx_timer_delta[i]) { | |
305 ev->timer_delta -= ngx_timer_delta[i]; | |
306 break; | |
307 } | |
308 | |
309 ngx_timer_delta[i] -= ev->timer_delta; | |
310 | |
311 #if 0 | |
312 if (ev->timer_delta > delta) { | |
313 ev->timer_delta -= delta; | |
314 break; | |
315 } | |
316 | |
317 delta -= ev->timer_delta; | |
318 #endif | |
319 | |
320 ngx_del_timer(ev); | |
321 | |
322 if (ev->delayed) { | |
323 ev->delayed = 0; | |
324 if (ev->ready == 0) { | |
325 continue; | |
326 } | |
327 | |
328 } else { | |
329 ev->timedout = 1; | |
330 } | |
331 | |
332 ev->event_handler(ev); | |
333 } | |
334 | |
335 ngx_timer_delta[i] = 0; | |
336 } | |
337 | |
338 #if 0 | |
339 ngx_expire_timers = 0; | |
340 | |
341 if (ngx_temp_timer_queue.timer_next == &ngx_temp_timer_queue) { | |
342 return; | |
343 } | |
344 | |
345 timer = 0; | |
346 | |
347 while (ngx_temp_timer_queue.timer_next != &ngx_temp_timer_queue) { | |
348 timer += ngx_temp_timer_queue.timer_next->timer_delta; | |
349 ev = ngx_temp_timer_queue.timer_next; | |
350 | |
351 #if (NGX_DEBUG_EVENT) | |
352 ngx_log_debug(ev->log, "process temp timer queue"); | |
353 #endif | |
354 | |
355 ngx_del_timer(ev); | |
356 ngx_add_timer(ev, timer); | |
357 } | |
358 #endif | |
359 } | |
360 | |
361 | |
362 #endif |