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