Optimization of kqueue event processing on connection close.

This commit is contained in:
Igor Sysoev
2017-06-06 18:57:52 +03:00
parent 71c906a512
commit 49e9049ed2

View File

@@ -293,17 +293,26 @@ nxt_kqueue_delete(nxt_event_engine_t *engine, nxt_fd_event_t *ev)
* Calling close() on a file descriptor will remove any kevents that * Calling close() on a file descriptor will remove any kevents that
* reference the descriptor. * reference the descriptor.
* *
* nxt_kqueue_close() always returns true as there are pending events on * So nxt_kqueue_close() returns true only if there are pending events.
* closing file descriptor because kevent() passes whole change list at once.
*/ */
static nxt_bool_t static nxt_bool_t
nxt_kqueue_close(nxt_event_engine_t *engine, nxt_fd_event_t *ev) nxt_kqueue_close(nxt_event_engine_t *engine, nxt_fd_event_t *ev)
{ {
struct kevent *kev, *end;
ev->read = NXT_EVENT_INACTIVE; ev->read = NXT_EVENT_INACTIVE;
ev->write = NXT_EVENT_INACTIVE; ev->write = NXT_EVENT_INACTIVE;
end = &engine->u.kqueue.changes[engine->u.kqueue.nchanges];
for (kev = engine->u.kqueue.changes; kev < end; kev++) {
if (kev->ident == (uintptr_t) ev->fd) {
return 1; return 1;
}
}
return 0;
} }