comparison src/event/modules/ngx_kqueue_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 a6afbb8a2ada
children e8cdc2989cee
comparison
equal deleted inserted replaced
52:9f2728644651 53:d1e42f1b8fd4
26 static int kq; 26 static int kq;
27 static struct kevent *change_list, *event_list; 27 static struct kevent *change_list, *event_list;
28 static unsigned int nchanges; 28 static unsigned int nchanges;
29 static int nevents; 29 static int nevents;
30 30
31 static ngx_event_t timer_queue; 31 static ngx_event_t *timer_queue;
32 /* */ 32 /* */
33 33
34 34
35 int ngx_kqueue_init(int max_connections, ngx_log_t *log) 35 int ngx_kqueue_init(int max_connections, ngx_log_t *log)
36 { 36 {
49 } 49 }
50 50
51 ngx_test_null(change_list, ngx_alloc(change_size, log), NGX_ERROR); 51 ngx_test_null(change_list, ngx_alloc(change_size, log), NGX_ERROR);
52 ngx_test_null(event_list, ngx_alloc(event_size, log), NGX_ERROR); 52 ngx_test_null(event_list, ngx_alloc(event_size, log), NGX_ERROR);
53 53
54 if (ngx_event_init_timer(log) == NGX_ERROR) { 54 timer_queue = ngx_event_init_timer(log);
55 if (timer_queue == NULL) {
55 return NGX_ERROR; 56 return NGX_ERROR;
56 } 57 }
57
58 #if 0
59 timer_queue.timer_prev = &timer_queue;
60 timer_queue.timer_next = &timer_queue;
61 #endif
62 58
63 #if !(USE_KQUEUE) 59 #if !(USE_KQUEUE)
64 ngx_event_actions.add = ngx_kqueue_add_event; 60 ngx_event_actions.add = ngx_kqueue_add_event;
65 ngx_event_actions.del = ngx_kqueue_del_event; 61 ngx_event_actions.del = ngx_kqueue_del_event;
66 ngx_event_actions.timer = ngx_kqueue_add_timer; 62 ngx_event_actions.timer = ngx_event_add_timer;
67 ngx_event_actions.process = ngx_kqueue_process_events; 63 ngx_event_actions.process = ngx_kqueue_process_events;
64
65 ngx_event_flags = NGX_HAVE_LEVEL_EVENT
66 |NGX_HAVE_ONESHOT_EVENT|NGX_HAVE_CLEAR_EVENT;
68 #endif 67 #endif
69 68
70 return NGX_OK; 69 return NGX_OK;
71 } 70 }
72 71
168 167
169 168
170 int ngx_kqueue_process_events(ngx_log_t *log) 169 int ngx_kqueue_process_events(ngx_log_t *log)
171 { 170 {
172 int events, i; 171 int events, i;
173 u_int timer, delta; 172 ngx_msec_t timer, delta;
174 ngx_event_t *ev; 173 ngx_event_t *ev;
175 struct timeval tv; 174 struct timeval tv;
176 struct timespec ts, *tp; 175 struct timespec ts, *tp;
177 176
178 timer = ngx_event_find_timer(); 177 timer = ngx_event_find_timer();
188 timer = 0; 187 timer = 0;
189 delta = 0; 188 delta = 0;
190 tp = NULL; 189 tp = NULL;
191 } 190 }
192 191
193 #if 0
194 if (timer_queue.timer_next != &timer_queue) {
195 timer = timer_queue.timer_next->timer_delta;
196 ts.tv_sec = timer / 1000;
197 ts.tv_nsec = (timer % 1000) * 1000000;
198 tp = &ts;
199 gettimeofday(&tv, NULL);
200 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
201
202 } else {
203 timer = 0;
204 delta = 0;
205 tp = NULL;
206 }
207 #endif
208
209 #if (NGX_DEBUG_EVENT) 192 #if (NGX_DEBUG_EVENT)
210 ngx_log_debug(log, "kevent timer: %d" _ timer); 193 ngx_log_debug(log, "kevent timer: %d" _ timer);
211 #endif 194 #endif
212 195
213 events = kevent(kq, change_list, nchanges, event_list, nevents, tp); 196 events = kevent(kq, change_list, nchanges, event_list, nevents, tp);
286 269
287 if (timer) { 270 if (timer) {
288 ngx_event_expire_timers(delta); 271 ngx_event_expire_timers(delta);
289 } 272 }
290 273
291 #if 0
292 if (timer && timer_queue.timer_next != &timer_queue) {
293 if (delta >= timer_queue.timer_next->timer_delta) {
294 for ( ;; ) {
295 ev = timer_queue.timer_next;
296
297 if (ev == &timer_queue || delta < ev->timer_delta) {
298 break;
299 }
300
301 delta -= ev->timer_delta;
302
303 ngx_del_timer(ev);
304 ev->timedout = 1;
305 if (ev->event_handler(ev) == NGX_ERROR) {
306 ev->close_handler(ev);
307 }
308 }
309
310 } else {
311 timer_queue.timer_next->timer_delta -= delta;
312 }
313 }
314 #endif
315
316 return NGX_OK; 274 return NGX_OK;
317 } 275 }
318
319
320 void ngx_kqueue_add_timer(ngx_event_t *ev, ngx_msec_t timer)
321 {
322 ngx_event_t *e;
323
324 #if (NGX_DEBUG_EVENT)
325 ngx_connection_t *c = (ngx_connection_t *) ev->data;
326 ngx_log_debug(ev->log, "set timer: %d:%d" _ c->fd _ timer);
327 #endif
328
329 if (ev->timer_next || ev->timer_prev) {
330 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set");
331 return;
332 }
333
334 for (e = timer_queue.timer_next;
335 e != &timer_queue && timer > e->timer_delta;
336 e = e->timer_next)
337 {
338 timer -= e->timer_delta;
339 }
340
341 ev->timer_delta = timer;
342
343 ev->timer_next = e;
344 ev->timer_prev = e->timer_prev;
345
346 e->timer_prev->timer_next = ev;
347 e->timer_prev = ev;
348 }