diff options
| author | Garrett D'Amore <garrett@damore.org> | 2024-12-18 10:59:49 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2024-12-18 10:59:49 -0800 |
| commit | 2be02b1d49cc20a851c2354161e61de36c57f65f (patch) | |
| tree | cb0f9677e3fa77e13b99fa3c96db8bdacd030c66 | |
| parent | 6c949de1cb46182303a85864bad753c12142fa97 (diff) | |
| download | nng-2be02b1d49cc20a851c2354161e61de36c57f65f.tar.gz nng-2be02b1d49cc20a851c2354161e61de36c57f65f.tar.bz2 nng-2be02b1d49cc20a851c2354161e61de36c57f65f.zip | |
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.
| -rw-r--r-- | src/platform/posix/posix_pollq_kqueue.c | 14 |
1 files changed, 6 insertions, 8 deletions
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); |
