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