Mercurial > hg > nginx
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 } |