Mercurial > hg > nginx
comparison src/event/modules/ngx_kqueue_module.c @ 195:8dee38ea9117
nginx-0.0.1-2003-11-25-23:44:56 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 25 Nov 2003 20:44:56 +0000 |
parents | 2357fa41738a |
children | 11fbd0fc041d |
comparison
equal
deleted
inserted
replaced
194:2357fa41738a | 195:8dee38ea9117 |
---|---|
188 } | 188 } |
189 | 189 |
190 | 190 |
191 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) | 191 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) |
192 { | 192 { |
193 ngx_event_t *e; | |
193 ngx_connection_t *c; | 194 ngx_connection_t *c; |
194 | 195 |
195 ev->active = 1; | 196 ev->active = 1; |
196 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; | 197 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; |
197 | 198 |
198 if (nchanges > 0 | 199 if (nchanges > 0 |
199 && ev->index < (u_int) nchanges | 200 && ev->index < (u_int) nchanges |
200 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) | 201 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) |
201 == (uintptr_t) ev) | 202 == (uintptr_t) ev) |
202 { | 203 { |
204 if (change_list[ev->index].flags == EV_DISABLE) { | |
205 | |
206 #if (NGX_DEBUG_EVENT) | |
207 ngx_connection_t *c = (ngx_connection_t *) ev->data; | |
208 ngx_log_debug(ev->log, "kqueue event activated: %d: ft:%d" _ | |
209 c->fd _ event); | |
210 #endif | |
211 | |
212 /* | |
213 * if the EV_DISABLE is still not passed to a kernel | |
214 * we will not pass it | |
215 */ | |
216 | |
217 if (ev->index < (u_int) --nchanges) { | |
218 e = (ngx_event_t *) change_list[nchanges].udata; | |
219 change_list[ev->index] = change_list[nchanges]; | |
220 e->index = ev->index; | |
221 } | |
222 | |
223 return NGX_OK; | |
224 } | |
225 | |
203 c = ev->data; | 226 c = ev->data; |
204 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | 227 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, |
205 "previous event on #%d were not passed in kernel", c->fd); | 228 "previous event on #%d were not passed in kernel", c->fd); |
206 | 229 |
207 return NGX_ERROR; | 230 return NGX_ERROR; |
208 } | 231 } |
209 | 232 |
210 return ngx_kqueue_set_event(ev, event, EV_ADD|flags); | 233 return ngx_kqueue_set_event(ev, event, EV_ADD|EV_ENABLE|flags); |
211 } | 234 } |
212 | 235 |
213 | 236 |
214 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) | 237 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) |
215 { | 238 { |
284 change_list[nchanges].ident = c->fd; | 307 change_list[nchanges].ident = c->fd; |
285 change_list[nchanges].filter = filter; | 308 change_list[nchanges].filter = filter; |
286 change_list[nchanges].flags = flags; | 309 change_list[nchanges].flags = flags; |
287 change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance); | 310 change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance); |
288 | 311 |
312 if (filter == EVFILT_VNODE) { | |
313 change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND | |
314 |NOTE_ATTRIB|NOTE_RENAME|NOTE_REVOKE; | |
315 change_list[nchanges].data = 0; | |
316 | |
317 } else { | |
289 #if (HAVE_LOWAT_EVENT) | 318 #if (HAVE_LOWAT_EVENT) |
290 | 319 if (flags & NGX_LOWAT_EVENT) { |
291 if (flags & NGX_LOWAT_EVENT) { | 320 change_list[nchanges].fflags = NOTE_LOWAT; |
292 change_list[nchanges].fflags = NOTE_LOWAT; | 321 change_list[nchanges].data = ev->available; |
293 change_list[nchanges].data = ev->available; | 322 |
294 | 323 } else { |
295 } else { | 324 change_list[nchanges].fflags = 0; |
325 change_list[nchanges].data = 0; | |
326 } | |
327 #else | |
296 change_list[nchanges].fflags = 0; | 328 change_list[nchanges].fflags = 0; |
297 change_list[nchanges].data = 0; | 329 change_list[nchanges].data = 0; |
298 } | 330 #endif |
299 | 331 } |
300 #else | |
301 | |
302 change_list[nchanges].fflags = 0; | |
303 change_list[nchanges].data = 0; | |
304 | |
305 #endif | |
306 | 332 |
307 ev->index = nchanges; | 333 ev->index = nchanges; |
308 | 334 |
309 nchanges++; | 335 nchanges++; |
310 | 336 |
363 | 389 |
364 #if (NGX_DEBUG_EVENT) | 390 #if (NGX_DEBUG_EVENT) |
365 ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta); | 391 ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta); |
366 #endif | 392 #endif |
367 | 393 |
394 #if 0 | |
368 /* | 395 /* |
369 * The expired timers must be handled before a processing of the events | 396 * The expired timers must be handled before a processing of the events |
370 * because the new timers can be added during a processing | 397 * because the new timers can be added during a processing |
371 */ | 398 */ |
372 | 399 |
373 ngx_event_expire_timers((ngx_msec_t) delta); | 400 ngx_event_expire_timers((ngx_msec_t) delta); |
401 #endif | |
402 | |
403 ngx_event_set_timer_delta((ngx_msec_t) delta); | |
374 | 404 |
375 } else { | 405 } else { |
376 if (events == 0) { | 406 if (events == 0) { |
377 ngx_log_error(NGX_LOG_ALERT, log, 0, | 407 ngx_log_error(NGX_LOG_ALERT, log, 0, |
378 "kevent() returned no events without timeout"); | 408 "kevent() returned no events without timeout"); |
450 | 480 |
451 ev->event_handler(ev); | 481 ev->event_handler(ev); |
452 | 482 |
453 break; | 483 break; |
454 | 484 |
485 case EVFILT_VNODE: | |
486 ev->kq_vnode = 1; | |
487 | |
488 ev->event_handler(ev); | |
489 | |
490 break; | |
491 | |
455 case EVFILT_AIO: | 492 case EVFILT_AIO: |
456 ev->complete = 1; | 493 ev->complete = 1; |
457 ev->ready = 1; | 494 ev->ready = 1; |
458 | 495 |
459 ev->event_handler(ev); | 496 ev->event_handler(ev); |
461 break; | 498 break; |
462 | 499 |
463 | 500 |
464 default: | 501 default: |
465 ngx_log_error(NGX_LOG_ALERT, log, 0, | 502 ngx_log_error(NGX_LOG_ALERT, log, 0, |
466 "unexpected kevent filter %d" _ event_list[i].filter); | 503 "unexpected kevent() filter %d", |
467 } | 504 event_list[i].filter); |
505 } | |
506 } | |
507 | |
508 if (timer) { | |
509 ngx_event_expire_timers((ngx_msec_t) delta); | |
468 } | 510 } |
469 | 511 |
470 return NGX_OK; | 512 return NGX_OK; |
471 } | 513 } |
472 | 514 |