From 2be02b1d49cc20a851c2354161e61de36c57f65f Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Wed, 18 Dec 2024 10:59:49 -0800 Subject: kqueue: eliminate extra locking on each I/O This should reduce lock pressure during I/O for FreeBSD and macOS, and should provide a small performance benefit. --- src/platform/posix/posix_pollq_kqueue.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'src/platform') diff --git a/src/platform/posix/posix_pollq_kqueue.c b/src/platform/posix/posix_pollq_kqueue.c index 562c888e..e78b89a8 100644 --- a/src/platform/posix/posix_pollq_kqueue.c +++ b/src/platform/posix/posix_pollq_kqueue.c @@ -240,13 +240,6 @@ nni_posix_poll_thr(void *arg) void *cbarg; unsigned revents; - nni_mtx_lock(&pq->mtx); - if (pq->closed) { - nni_mtx_unlock(&pq->mtx); - nni_posix_pollq_reap(pq); - return; - } - nni_mtx_unlock(&pq->mtx); n = kevent(pq->kq, NULL, 0, evs, NNI_MAX_KQUEUE_EVENTS, NULL); for (int i = 0; i < n; i++) { @@ -261,6 +254,10 @@ nni_posix_poll_thr(void *arg) break; } if (ev->udata == NULL) { + if (ev->flags & EV_EOF) { + nni_posix_pollq_reap(pq); + return; + } nni_plat_pipe_clear(pq->wake_rfd); nni_posix_pollq_reap(pq); continue; @@ -291,8 +288,9 @@ nni_posix_pollq_destroy(nni_posix_pollq *pq) nni_mtx_unlock(&pq->mtx); nni_plat_pipe_raise(pq->wake_wfd); + (void) close(pq->wake_wfd); nni_thr_fini(&pq->thr); - nni_plat_pipe_close(pq->wake_wfd, pq->wake_rfd); + (void) close(pq->wake_rfd); if (pq->kq >= 0) { close(pq->kq); -- cgit v1.2.3-70-g09d2