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 }