From 2184ebfaaaaa8e5863cfe5dcbf05e77b49abcd38 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Mon, 10 Aug 2009 23:56:03 -0400 Subject: [PATCH] Make the kqueue ioset back-end less whiny. src/ioset-kevent.c (ioset_kevent_add): Never try to use EV_DELETE, because that can make kevent() return -1/ENOENT. (ioset_kevent_update): We need to try to EV_DELETE here instead. (ioset_kevent_loop): Do not bail if kevent() just returns -1/EINTR. --- src/ioset-kevent.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/ioset-kevent.c b/src/ioset-kevent.c index 5d6f0bb..d657082 100644 --- a/src/ioset-kevent.c +++ b/src/ioset-kevent.c @@ -46,7 +46,9 @@ ioset_kevent_add(struct io_fd *fd) int res; EV_SET(&changes[nchanges++], fd->fd, EVFILT_READ, EV_ADD, 0, 0, fd); - EV_SET(&changes[nchanges++], fd->fd, EVFILT_WRITE, fd_wants_writes(fd) ? EV_ADD : EV_DELETE, 0, 0, fd); + if (fd_wants_writes(fd)) { + EV_SET(&changes[nchanges++], fd->fd, EVFILT_WRITE, EV_ADD, 0, 0, fd); + } res = kevent(kq_fd, changes, nchanges, NULL, 0, NULL); if (res < 0) { log_module(MAIN_LOG, LOG_ERROR, "kevent() add failed: %s", strerror(errno)); @@ -73,7 +75,16 @@ ioset_kevent_remove(struct io_fd *fd, int closed) static void ioset_kevent_update(struct io_fd *fd) { - ioset_kevent_add(fd); + struct kevent changes[2]; + int nchanges = 0; + int res; + + EV_SET(&changes[nchanges++], fd->fd, EVFILT_READ, EV_ADD, 0, 0, fd); + EV_SET(&changes[nchanges++], fd->fd, EVFILT_WRITE, fd_wants_writes(fd) ? EV_ADD : EV_DELETE, 0, 0, fd); + res = kevent(kq_fd, changes, nchanges, NULL, 0, NULL); + if (res < 0) { + log_module(MAIN_LOG, LOG_ERROR, "kevent() add failed: %s", strerror(errno)); + } } static void @@ -102,7 +113,7 @@ ioset_kevent_loop(struct timeval *timeout) pts = NULL; } res = kevent(kq_fd, NULL, 0, events, MAX_EVENTS, pts); - if (res < 0) { + if ((res < 0) && (errno != EINTR)) { log_module(MAIN_LOG, LOG_ERROR, "kevent() poll failed: %s", strerror(errno)); return 1; } -- 2.20.1