comparison src/event/modules/ngx_poll_module.c @ 53:d1e42f1b8fd4

nginx-0.0.1-2003-01-27-00:08:14 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 26 Jan 2003 21:08:14 +0000
parents b288069a8696
children e8cdc2989cee
comparison
equal deleted inserted replaced
52:9f2728644651 53:d1e42f1b8fd4
15 static struct pollfd *event_list; 15 static struct pollfd *event_list;
16 static unsigned int nevents; 16 static unsigned int nevents;
17 17
18 static ngx_event_t **event_index; 18 static ngx_event_t **event_index;
19 static ngx_event_t **ready_index; 19 static ngx_event_t **ready_index;
20 static ngx_event_t timer_queue; 20 static ngx_event_t *timer_queue;
21 /* */ 21 /* */
22 22
23 int ngx_poll_init(int max_connections, ngx_log_t *log) 23 int ngx_poll_init(int max_connections, ngx_log_t *log)
24 { 24 {
25 ngx_test_null(event_list, 25 ngx_test_null(event_list,
34 ngx_alloc(sizeof(ngx_event_t *) * 2 * max_connections, log), 34 ngx_alloc(sizeof(ngx_event_t *) * 2 * max_connections, log),
35 NGX_ERROR); 35 NGX_ERROR);
36 36
37 nevents = 0; 37 nevents = 0;
38 38
39 timer_queue.timer_prev = &timer_queue; 39 timer_queue = ngx_event_init_timer(log);
40 timer_queue.timer_next = &timer_queue; 40 if (timer_queue == NULL) {
41 return NGX_ERROR;
42 }
41 43
42 ngx_event_actions.add = ngx_poll_add_event; 44 ngx_event_actions.add = ngx_poll_add_event;
43 ngx_event_actions.del = ngx_poll_del_event; 45 ngx_event_actions.del = ngx_poll_del_event;
44 ngx_event_actions.timer = ngx_poll_add_timer; 46 ngx_event_actions.timer = ngx_event_add_timer;
45 ngx_event_actions.process = ngx_poll_process_events; 47 ngx_event_actions.process = ngx_poll_process_events;
46 48
47 return NGX_OK; 49 return NGX_OK;
48 } 50 }
49 51
137 } 139 }
138 140
139 int ngx_poll_process_events(ngx_log_t *log) 141 int ngx_poll_process_events(ngx_log_t *log)
140 { 142 {
141 int i, ready, nready, found; 143 int i, ready, nready, found;
142 u_int timer, delta; 144 ngx_msec_t timer, delta;
143 ngx_err_t err; 145 ngx_err_t err;
144 ngx_event_t *ev; 146 ngx_event_t *ev;
145 ngx_connection_t *c; 147 ngx_connection_t *c;
146 148
147 if (timer_queue.timer_next != &timer_queue) { 149 timer = ngx_event_find_timer();
148 timer = timer_queue.timer_next->timer_delta; 150
151 if (timer) {
149 delta = ngx_msec(); 152 delta = ngx_msec();
150 153
151 } else { 154 } else {
152 timer = INFTIM; 155 timer = INFTIM;
153 delta = 0; 156 delta = 0;
251 254
252 if (ready != 0) { 255 if (ready != 0) {
253 ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events"); 256 ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events");
254 } 257 }
255 258
256 if (timer != INFTIM && timer_queue.timer_next != &timer_queue) { 259 if (timer != INFTIM) {
257 if (delta >= timer_queue.timer_next->timer_delta) { 260 ngx_event_expire_timers(delta);
258 for ( ;; ) { 261 }
259 ev = timer_queue.timer_next; 262
260 263 return NGX_OK;
261 if (ev == &timer_queue || delta < ev->timer_delta) { 264 }
262 break;
263 }
264
265 delta -= ev->timer_delta;
266
267 ngx_del_timer(ev);
268 ev->timedout = 1;
269 if (ev->event_handler(ev) == NGX_ERROR) {
270 ev->close_handler(ev);
271 }
272 }
273
274 } else {
275 timer_queue.timer_next->timer_delta -= delta;
276 }
277 }
278
279 return NGX_OK;
280 }
281
282 void ngx_poll_add_timer(ngx_event_t *ev, ngx_msec_t timer)
283 {
284 ngx_event_t *e;
285
286 #if (NGX_DEBUG_EVENT)
287 ngx_connection_t *c = (ngx_connection_t *) ev->data;
288 ngx_log_debug(ev->log, "set timer: %d:%d" _ c->fd _ timer);
289 #endif
290
291 if (ev->timer_next || ev->timer_prev) {
292 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set");
293 return;
294 }
295
296 for (e = timer_queue.timer_next;
297 e != &timer_queue && timer > e->timer_delta;
298 e = e->timer_next)
299 {
300 timer -= e->timer_delta;
301 }
302
303 ev->timer_delta = timer;
304
305 ev->timer_next = e;
306 ev->timer_prev = e->timer_prev;
307
308 e->timer_prev->timer_next = ev;
309 e->timer_prev = ev;
310 }