Mercurial > hg > nginx
diff 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 |
line wrap: on
line diff
--- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -190,6 +190,7 @@ static void ngx_kqueue_done(ngx_cycle_t static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) { + ngx_event_t *e; ngx_connection_t *c; ev->active = 1; @@ -200,6 +201,28 @@ static int ngx_kqueue_add_event(ngx_even && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) == (uintptr_t) ev) { + if (change_list[ev->index].flags == EV_DISABLE) { + +#if (NGX_DEBUG_EVENT) + ngx_connection_t *c = (ngx_connection_t *) ev->data; + ngx_log_debug(ev->log, "kqueue event activated: %d: ft:%d" _ + c->fd _ event); +#endif + + /* + * if the EV_DISABLE is still not passed to a kernel + * we will not pass it + */ + + if (ev->index < (u_int) --nchanges) { + e = (ngx_event_t *) change_list[nchanges].udata; + change_list[ev->index] = change_list[nchanges]; + e->index = ev->index; + } + + return NGX_OK; + } + c = ev->data; ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "previous event on #%d were not passed in kernel", c->fd); @@ -207,7 +230,7 @@ static int ngx_kqueue_add_event(ngx_even return NGX_ERROR; } - return ngx_kqueue_set_event(ev, event, EV_ADD|flags); + return ngx_kqueue_set_event(ev, event, EV_ADD|EV_ENABLE|flags); } @@ -286,24 +309,27 @@ static int ngx_kqueue_set_event(ngx_even change_list[nchanges].flags = flags; change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance); -#if (HAVE_LOWAT_EVENT) - - if (flags & NGX_LOWAT_EVENT) { - change_list[nchanges].fflags = NOTE_LOWAT; - change_list[nchanges].data = ev->available; + if (filter == EVFILT_VNODE) { + change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND + |NOTE_ATTRIB|NOTE_RENAME|NOTE_REVOKE; + change_list[nchanges].data = 0; } else { +#if (HAVE_LOWAT_EVENT) + if (flags & NGX_LOWAT_EVENT) { + change_list[nchanges].fflags = NOTE_LOWAT; + change_list[nchanges].data = ev->available; + + } else { + change_list[nchanges].fflags = 0; + change_list[nchanges].data = 0; + } +#else change_list[nchanges].fflags = 0; change_list[nchanges].data = 0; +#endif } -#else - - change_list[nchanges].fflags = 0; - change_list[nchanges].data = 0; - -#endif - ev->index = nchanges; nchanges++; @@ -365,12 +391,16 @@ static int ngx_kqueue_process_events(ngx ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta); #endif +#if 0 /* * The expired timers must be handled before a processing of the events * because the new timers can be added during a processing */ ngx_event_expire_timers((ngx_msec_t) delta); +#endif + + ngx_event_set_timer_delta((ngx_msec_t) delta); } else { if (events == 0) { @@ -452,6 +482,13 @@ static int ngx_kqueue_process_events(ngx break; + case EVFILT_VNODE: + ev->kq_vnode = 1; + + ev->event_handler(ev); + + break; + case EVFILT_AIO: ev->complete = 1; ev->ready = 1; @@ -463,10 +500,15 @@ static int ngx_kqueue_process_events(ngx default: ngx_log_error(NGX_LOG_ALERT, log, 0, - "unexpected kevent filter %d" _ event_list[i].filter); + "unexpected kevent() filter %d", + event_list[i].filter); } } + if (timer) { + ngx_event_expire_timers((ngx_msec_t) delta); + } + return NGX_OK; }