nginx-0.0.7-2004-06-29-01:03:14 import
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 99370ac..cc84d2e 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -193,7 +193,8 @@
ev->disabled = 0;
ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
- if (nchanges > 0
+ if (ngx_thread_main()
+ && nchanges > 0
&& ev->index < (u_int) nchanges
&& ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)
== (uintptr_t) ev)
@@ -237,7 +238,8 @@
ev->disabled = 0;
ev->posted = 0;
- if (nchanges > 0
+ if (ngx_thread_main()
+ && nchanges > 0
&& ev->index < (u_int) nchanges
&& ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)
== (uintptr_t) ev)
@@ -280,6 +282,7 @@
{
struct timespec ts;
ngx_connection_t *c;
+ struct kevent *kev, kv;
c = ev->data;
@@ -287,7 +290,7 @@
"kevent set event: %d: ft:%d fl:%04X",
c->fd, filter, flags);
- if (nchanges >= max_changes) {
+ if (ngx_thread_main() && nchanges >= max_changes) {
ngx_log_error(NGX_LOG_WARN, ev->log, 0,
"kqueue change list is filled up");
@@ -302,40 +305,52 @@
nchanges = 0;
}
- change_list[nchanges].ident = c->fd;
- change_list[nchanges].filter = filter;
- change_list[nchanges].flags = flags;
- change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance);
+ kev = ngx_thread_main() ? &change_list[nchanges] : &kv;
+
+ kev->ident = c->fd;
+ kev->filter = filter;
+ kev->flags = flags;
+ kev->udata = (void *) ((uintptr_t) ev | ev->instance);
if (filter == EVFILT_VNODE) {
- change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND
- |NOTE_ATTRIB|NOTE_RENAME
+ kev->fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND
+ |NOTE_ATTRIB|NOTE_RENAME
#if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \
|| __FreeBSD_version >= 500018
- |NOTE_REVOKE
+ |NOTE_REVOKE
#endif
;
- change_list[nchanges].data = 0;
+ kev->data = 0;
} else {
#if (HAVE_LOWAT_EVENT)
if (flags & NGX_LOWAT_EVENT) {
- change_list[nchanges].fflags = NOTE_LOWAT;
- change_list[nchanges].data = ev->available;
+ kev->fflags = NOTE_LOWAT;
+ kev->data = ev->available;
} else {
- change_list[nchanges].fflags = 0;
- change_list[nchanges].data = 0;
+ kev->fflags = 0;
+ kev->data = 0;
}
#else
- change_list[nchanges].fflags = 0;
- change_list[nchanges].data = 0;
+ kev->fflags = 0;
+ kev->data = 0;
#endif
}
- ev->index = nchanges;
+ if (ngx_thread_main()) {
+ ev->index = nchanges;
+ nchanges++;
- nchanges++;
+ } else {
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+
+ if (kevent(ngx_kqueue, &kv, 1, NULL, 0, &ts) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed");
+ return NGX_ERROR;
+ }
+ }
return NGX_OK;
}