Mercurial > hg > nginx
comparison src/event/modules/ngx_devpoll_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 |
---|---|
27 static unsigned int nchanges; | 27 static unsigned int nchanges; |
28 static int nevents; | 28 static int nevents; |
29 | 29 |
30 static ngx_event_t **change_index; | 30 static ngx_event_t **change_index; |
31 | 31 |
32 static ngx_event_t timer_queue; | 32 static ngx_event_t *timer_queue; |
33 /* */ | 33 /* */ |
34 | 34 |
35 | 35 |
36 int ngx_devpoll_init(int max_connections, ngx_log_t *log) | 36 int ngx_devpoll_init(int max_connections, ngx_log_t *log) |
37 { | 37 { |
53 ngx_test_null(event_list, ngx_alloc(event_size, log), NGX_ERROR); | 53 ngx_test_null(event_list, ngx_alloc(event_size, log), NGX_ERROR); |
54 ngx_test_null(change_index, | 54 ngx_test_null(change_index, |
55 ngx_alloc(sizeof(ngx_event_t *) * DEVPOLL_NCHANGES, log), | 55 ngx_alloc(sizeof(ngx_event_t *) * DEVPOLL_NCHANGES, log), |
56 NGX_ERROR); | 56 NGX_ERROR); |
57 | 57 |
58 timer_queue.timer_prev = &timer_queue; | 58 timer_queue = ngx_event_init_timer(log); |
59 timer_queue.timer_next = &timer_queue; | 59 if (timer_queue == NULL) { |
60 return NGX_ERROR; | |
61 } | |
60 | 62 |
61 #if !(USE_DEVPOLL) | 63 #if !(USE_DEVPOLL) |
62 ngx_event_actions.add = ngx_devpoll_add_event; | 64 ngx_event_actions.add = ngx_devpoll_add_event; |
63 ngx_event_actions.del = ngx_devpoll_del_event; | 65 ngx_event_actions.del = ngx_devpoll_del_event; |
64 ngx_event_actions.timer = ngx_devpoll_add_timer; | 66 ngx_event_actions.timer = ngx_event_add_timer; |
65 ngx_event_actions.process = ngx_devpoll_process_events; | 67 ngx_event_actions.process = ngx_devpoll_process_events; |
66 #endif | 68 #endif |
67 | 69 |
68 return NGX_OK; | 70 return NGX_OK; |
69 } | 71 } |
114 | 116 |
115 if (flags & NGX_CLOSE_EVENT) { | 117 if (flags & NGX_CLOSE_EVENT) { |
116 return NGX_OK; | 118 return NGX_OK; |
117 } | 119 } |
118 | 120 |
121 /* we need to restore second event if it exists */ | |
122 | |
119 if (event == NGX_READ_EVENT) { | 123 if (event == NGX_READ_EVENT) { |
120 e = c->write; | 124 e = c->write; |
121 event = POLLOUT; | 125 event = POLLOUT; |
122 | 126 |
123 } else { | 127 } else { |
184 | 188 |
185 | 189 |
186 int ngx_devpoll_process_events(ngx_log_t *log) | 190 int ngx_devpoll_process_events(ngx_log_t *log) |
187 { | 191 { |
188 int events, n, i; | 192 int events, n, i; |
189 u_int timer, delta; | 193 ngx_msec_t timer, delta; |
190 ngx_err_t err; | 194 ngx_err_t err; |
191 ngx_event_t *ev; | 195 ngx_event_t *ev; |
192 ngx_connection_t *c; | 196 ngx_connection_t *c; |
193 struct dvpoll dvp; | 197 struct dvpoll dvp; |
194 struct timeval tv; | 198 struct timeval tv; |
195 | 199 |
196 if (timer_queue.timer_next != &timer_queue) { | 200 timer = ngx_event_find_timer(); |
197 timer = timer_queue.timer_next->timer_delta; | 201 |
202 if (timer) { | |
198 gettimeofday(&tv, NULL); | 203 gettimeofday(&tv, NULL); |
199 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000; | 204 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000; |
200 | 205 |
201 } else { | 206 } else { |
202 timer = INFTIM; | 207 timer = INFTIM; |
298 "ioctl(DP_POLL) error on %d:%d", | 303 "ioctl(DP_POLL) error on %d:%d", |
299 event_list[i].fd, event_list[i].revents); | 304 event_list[i].fd, event_list[i].revents); |
300 } | 305 } |
301 } | 306 } |
302 | 307 |
303 if (timer != INFTIM && timer_queue.timer_next != &timer_queue) { | 308 if (timer != INFTIM) { |
304 if (delta >= timer_queue.timer_next->timer_delta) { | 309 ngx_event_expire_timers(delta); |
305 for ( ;; ) { | |
306 ev = timer_queue.timer_next; | |
307 | |
308 if (ev == &timer_queue || delta < ev->timer_delta) { | |
309 break; | |
310 } | |
311 | |
312 delta -= ev->timer_delta; | |
313 | |
314 ngx_del_timer(ev); | |
315 ev->timedout = 1; | |
316 if (ev->event_handler(ev) == NGX_ERROR) { | |
317 ev->close_handler(ev); | |
318 } | |
319 } | |
320 | |
321 } else { | |
322 timer_queue.timer_next->timer_delta -= delta; | |
323 } | |
324 } | 310 } |
325 | 311 |
326 return NGX_OK; | 312 return NGX_OK; |
327 } | 313 } |
328 | |
329 | |
330 void ngx_devpoll_add_timer(ngx_event_t *ev, ngx_msec_t timer) | |
331 { | |
332 ngx_event_t *e; | |
333 | |
334 #if (NGX_DEBUG_EVENT) | |
335 ngx_connection_t *c = (ngx_connection_t *) ev->data; | |
336 ngx_log_debug(ev->log, "set timer: %d:%d" _ c->fd _ timer); | |
337 #endif | |
338 | |
339 if (ev->timer_next || ev->timer_prev) { | |
340 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); | |
341 return; | |
342 } | |
343 | |
344 for (e = timer_queue.timer_next; | |
345 e != &timer_queue && timer > e->timer_delta; | |
346 e = e->timer_next) | |
347 { | |
348 timer -= e->timer_delta; | |
349 } | |
350 | |
351 ev->timer_delta = timer; | |
352 | |
353 ev->timer_next = e; | |
354 ev->timer_prev = e->timer_prev; | |
355 | |
356 e->timer_prev->timer_next = ev; | |
357 e->timer_prev = ev; | |
358 } |