Mercurial > hg > nginx
comparison src/event/modules/ngx_kqueue_module.c @ 194:2357fa41738a
nginx-0.0.1-2003-11-21-09:30:49 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 21 Nov 2003 06:30:49 +0000 |
parents | c966c09be66b |
children | 8dee38ea9117 |
comparison
equal
deleted
inserted
replaced
193:dd66383796a5 | 194:2357fa41738a |
---|---|
9 #include <ngx_event.h> | 9 #include <ngx_event.h> |
10 #include <ngx_kqueue_module.h> | 10 #include <ngx_kqueue_module.h> |
11 | 11 |
12 | 12 |
13 typedef struct { | 13 typedef struct { |
14 u_int changes; | 14 int changes; |
15 u_int events; | 15 int events; |
16 } ngx_kqueue_conf_t; | 16 } ngx_kqueue_conf_t; |
17 | 17 |
18 | 18 |
19 static int ngx_kqueue_init(ngx_cycle_t *cycle); | 19 static int ngx_kqueue_init(ngx_cycle_t *cycle); |
20 static void ngx_kqueue_done(ngx_cycle_t *cycle); | 20 static void ngx_kqueue_done(ngx_cycle_t *cycle); |
28 | 28 |
29 | 29 |
30 int ngx_kqueue = -1; | 30 int ngx_kqueue = -1; |
31 | 31 |
32 static struct kevent *change_list, *event_list; | 32 static struct kevent *change_list, *event_list; |
33 static u_int max_changes, nchanges, nevents; | 33 static int max_changes, nchanges, nevents; |
34 | 34 |
35 | 35 |
36 static ngx_str_t kqueue_name = ngx_string("kqueue"); | 36 static ngx_str_t kqueue_name = ngx_string("kqueue"); |
37 | 37 |
38 static ngx_command_t ngx_kqueue_commands[] = { | 38 static ngx_command_t ngx_kqueue_commands[] = { |
194 | 194 |
195 ev->active = 1; | 195 ev->active = 1; |
196 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; | 196 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; |
197 | 197 |
198 if (nchanges > 0 | 198 if (nchanges > 0 |
199 && ev->index < nchanges | 199 && ev->index < (u_int) nchanges |
200 && (void *) ((uintptr_t) change_list[ev->index].udata & ~1) == ev) | 200 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) |
201 == (uintptr_t) ev) | |
201 { | 202 { |
202 c = ev->data; | 203 c = ev->data; |
203 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | 204 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, |
204 "previous event on #%d were not passed in kernel", c->fd); | 205 "previous event on #%d were not passed in kernel", c->fd); |
205 | 206 |
206 return NGX_ERROR; | 207 return NGX_ERROR; |
207 } | 208 } |
208 | 209 |
209 return ngx_kqueue_set_event(ev, event, EV_ADD | flags); | 210 return ngx_kqueue_set_event(ev, event, EV_ADD|flags); |
210 } | 211 } |
211 | 212 |
212 | 213 |
213 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) | 214 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) |
214 { | 215 { |
215 ngx_event_t *e; | 216 ngx_event_t *e; |
216 | 217 |
217 ev->active = 0; | 218 ev->active = 0; |
218 | 219 |
219 if (nchanges > 0 | 220 if (nchanges > 0 |
220 && ev->index < nchanges | 221 && ev->index < (u_int) nchanges |
221 && (void *) ((uintptr_t) change_list[ev->index].udata & ~1) == ev) | 222 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) |
223 == (uintptr_t) ev) | |
222 { | 224 { |
223 #if (NGX_DEBUG_EVENT) | 225 #if (NGX_DEBUG_EVENT) |
224 ngx_connection_t *c = (ngx_connection_t *) ev->data; | 226 ngx_connection_t *c = (ngx_connection_t *) ev->data; |
225 ngx_log_debug(ev->log, "kqueue event deleted: %d: ft:%d" _ | 227 ngx_log_debug(ev->log, "kqueue event deleted: %d: ft:%d" _ |
226 c->fd _ event); | 228 c->fd _ event); |
227 #endif | 229 #endif |
228 | 230 |
229 /* if the event is still not passed to a kernel we will not pass it */ | 231 /* if the event is still not passed to a kernel we will not pass it */ |
230 | 232 |
231 if (ev->index < --nchanges) { | 233 if (ev->index < (u_int) --nchanges) { |
232 e = (ngx_event_t *) change_list[nchanges].udata; | 234 e = (ngx_event_t *) change_list[nchanges].udata; |
233 change_list[ev->index] = change_list[nchanges]; | 235 change_list[ev->index] = change_list[nchanges]; |
234 e->index = ev->index; | 236 e->index = ev->index; |
235 } | 237 } |
236 | 238 |
245 | 247 |
246 if (flags & NGX_CLOSE_EVENT) { | 248 if (flags & NGX_CLOSE_EVENT) { |
247 return NGX_OK; | 249 return NGX_OK; |
248 } | 250 } |
249 | 251 |
250 return ngx_kqueue_set_event(ev, event, EV_DELETE); | 252 return ngx_kqueue_set_event(ev, event, |
253 flags & NGX_DISABLE_EVENT ? EV_DISABLE : EV_DELETE); | |
251 } | 254 } |
252 | 255 |
253 | 256 |
254 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) | 257 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) |
255 { | 258 { |
418 | 421 |
419 case EVFILT_READ: | 422 case EVFILT_READ: |
420 case EVFILT_WRITE: | 423 case EVFILT_WRITE: |
421 | 424 |
422 instance = (uintptr_t) ev & 1; | 425 instance = (uintptr_t) ev & 1; |
423 ev = (void *) ((uintptr_t) ev & ~1); | 426 ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1); |
424 | 427 |
425 /* | 428 /* |
426 * it's a stale event from a file descriptor | 429 * it's a stale event from a file descriptor |
427 * that was just closed in this iteration | 430 * that was just closed in this iteration |
428 */ | 431 */ |
484 | 487 |
485 static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf) | 488 static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf) |
486 { | 489 { |
487 ngx_kqueue_conf_t *kcf = conf; | 490 ngx_kqueue_conf_t *kcf = conf; |
488 | 491 |
489 ngx_conf_init_unsigned_value(kcf->changes, 512); | 492 ngx_conf_init_value(kcf->changes, 512); |
490 ngx_conf_init_unsigned_value(kcf->events, 512); | 493 ngx_conf_init_value(kcf->events, 512); |
491 | 494 |
492 return NGX_CONF_OK; | 495 return NGX_CONF_OK; |
493 } | 496 } |