Mercurial > hg > nginx
comparison src/event/modules/ngx_kqueue_module.c @ 8:708f8bb772ec
nginx-0.0.1-2002-09-02-18:48:24 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 02 Sep 2002 14:48:24 +0000 |
parents | b5481d6fbbd4 |
children | f323b4f74e4a |
comparison
equal
deleted
inserted
replaced
7:b5481d6fbbd4 | 8:708f8bb772ec |
---|---|
17 | 17 |
18 #if (USE_KQUEUE) && !(HAVE_KQUEUE) | 18 #if (USE_KQUEUE) && !(HAVE_KQUEUE) |
19 #error "kqueue is not supported on this platform" | 19 #error "kqueue is not supported on this platform" |
20 #endif | 20 #endif |
21 | 21 |
22 static void ngx_add_timer_core(ngx_event_t *ev, u_int timer); | |
23 | 22 |
24 | 23 |
25 static int kq; | 24 static int kq; |
26 static struct kevent *change_list, *event_list; | 25 static struct kevent *change_list, *event_list; |
27 static int nchanges, nevents; | 26 static int nchanges, nevents; |
48 timer_queue.timer_next = &timer_queue; | 47 timer_queue.timer_next = &timer_queue; |
49 | 48 |
50 #if !(USE_KQUEUE) | 49 #if !(USE_KQUEUE) |
51 ngx_event_actions.add = ngx_kqueue_add_event; | 50 ngx_event_actions.add = ngx_kqueue_add_event; |
52 ngx_event_actions.del = ngx_kqueue_del_event; | 51 ngx_event_actions.del = ngx_kqueue_del_event; |
52 ngx_event_actions.timer = ngx_kqueue_add_timer; | |
53 ngx_event_actions.process = ngx_kqueue_process_events; | 53 ngx_event_actions.process = ngx_kqueue_process_events; |
54 #endif | 54 #endif |
55 | 55 |
56 } | 56 } |
57 | 57 |
58 int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) | 58 int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) |
59 { | 59 { |
60 if (event == NGX_TIMER_EVENT) { | |
61 ngx_add_timer_core(ev, flags); | |
62 return 0; | |
63 } | |
64 | |
65 return ngx_kqueue_set_event(ev, event, EV_ADD | flags); | 60 return ngx_kqueue_set_event(ev, event, EV_ADD | flags); |
66 } | 61 } |
67 | 62 |
68 int ngx_kqueue_del_event(ngx_event_t *ev, int event) | 63 int ngx_kqueue_del_event(ngx_event_t *ev, int event) |
69 { | 64 { |
70 if (event == NGX_TIMER_EVENT) { | |
71 ngx_del_timer(ev); | |
72 return 0; | |
73 } | |
74 | |
75 return ngx_kqueue_set_event(ev, event, EV_DELETE); | 65 return ngx_kqueue_set_event(ev, event, EV_DELETE); |
76 } | 66 } |
77 | 67 |
78 int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) | 68 int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) |
79 { | 69 { |
154 /* void */) | 144 /* void */) |
155 { | 145 { |
156 delta -= ev->timer_delta; | 146 delta -= ev->timer_delta; |
157 nx = ev->timer_next; | 147 nx = ev->timer_next; |
158 ngx_del_timer(ev); | 148 ngx_del_timer(ev); |
159 #if 1 | |
160 ev->timedout = 1; | 149 ev->timedout = 1; |
161 if (ev->event_handler(ev) == NGX_ERROR) | 150 if (ev->event_handler(ev) == NGX_ERROR) |
162 ev->close_handler(ev); | 151 ev->close_handler(ev); |
163 #else | |
164 if (ev->timer_handler(ev) == -1) | |
165 ev->close_handler(ev); | |
166 #endif | |
167 ev = nx; | 152 ev = nx; |
168 } | 153 } |
169 | 154 |
170 } else { | 155 } else { |
171 timer_queue.timer_next->timer_delta -= delta; | 156 timer_queue.timer_next->timer_delta -= delta; |
180 event_list[i].flags _ event_list[i].fflags _ | 165 event_list[i].flags _ event_list[i].fflags _ |
181 event_list[i].data _ event_list[i].udata); | 166 event_list[i].data _ event_list[i].udata); |
182 | 167 |
183 if (event_list[i].flags & EV_ERROR) { | 168 if (event_list[i].flags & EV_ERROR) { |
184 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, | 169 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, |
185 "ngx_kqueue_process_events: kevent error"); | 170 "ngx_kqueue_process_events: kevent error on %d", |
171 event_list[i].ident); | |
186 continue; | 172 continue; |
187 } | 173 } |
188 | 174 |
189 ev = (ngx_event_t *) event_list[i].udata; | 175 ev = (ngx_event_t *) event_list[i].udata; |
190 | 176 |
213 } | 199 } |
214 | 200 |
215 return 0; | 201 return 0; |
216 } | 202 } |
217 | 203 |
218 static void ngx_add_timer_core(ngx_event_t *ev, u_int timer) | 204 void ngx_kqueue_add_timer(ngx_event_t *ev, ngx_msec_t timer) |
219 { | 205 { |
220 ngx_event_t *e; | 206 ngx_event_t *e; |
207 | |
208 ngx_log_debug(ev->log, "set timer: %d" _ timer); | |
221 | 209 |
222 for (e = timer_queue.timer_next; | 210 for (e = timer_queue.timer_next; |
223 e != &timer_queue && timer > e->timer_delta; | 211 e != &timer_queue && timer > e->timer_delta; |
224 e = e->timer_next) | 212 e = e->timer_next) |
225 timer -= e->timer_delta; | 213 timer -= e->timer_delta; |
230 ev->timer_prev = e->timer_prev; | 218 ev->timer_prev = e->timer_prev; |
231 | 219 |
232 e->timer_prev->timer_next = ev; | 220 e->timer_prev->timer_next = ev; |
233 e->timer_prev = ev; | 221 e->timer_prev = ev; |
234 } | 222 } |
235 | |
236 #if 0 | |
237 static void ngx_inline ngx_del_timer(ngx_event_t *ev) | |
238 { | |
239 if (ev->timer_prev) | |
240 ev->timer_prev->timer_next = ev->timer_next; | |
241 | |
242 if (ev->timer_next) { | |
243 ev->timer_next->timer_prev = ev->timer_prev; | |
244 ev->timer_next = NULL; | |
245 } | |
246 | |
247 if (ev->timer_prev) | |
248 ev->timer_prev = NULL; | |
249 } | |
250 #endif |