diff --git a/liberty.c b/liberty.c index 2be7c13..4980a53 100644 --- a/liberty.c +++ b/liberty.c @@ -1612,6 +1612,8 @@ poller_set (struct poller *self, struct poller_fd *fd) modifying ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, fd->fd, &event) != -1); } +#define poller_post_fork(self) + static int poller_compare_fds (const void *ax, const void *bx) { @@ -1763,12 +1765,10 @@ static void poller_set (struct poller *self, struct poller_fd *fd) { hard_assert (fd->poller == self); - bool modifying = true; if (fd->index == -1) { poller_ensure_space (self); self->fds[fd->index = self->len++] = fd; - modifying = false; } // We have to watch for readability and writeability separately; @@ -1784,6 +1784,18 @@ poller_set (struct poller *self, struct poller_fd *fd) exit_fatal ("%s: %s", "kevent", strerror (errno)); } +static void +poller_post_fork (struct poller *self) +{ + // The kqueue FD isn't preserved across forks, need to recreate it + self->kqueue_fd = kqueue (); + hard_assert (self->kqueue_fd != -1); + set_cloexec (self->kqueue_fd); + + for (size_t i = 0; i < self->len; i++) + poller_set (self, self->fds[i]); +} + static int poller_compare_fds (const void *ax, const void *bx) { @@ -1987,6 +1999,8 @@ poller_set (struct poller *self, struct poller_fd *fd) new_entry->events = fd->events; } +#define poller_post_fork(self) + static void poller_remove_at_index (struct poller *self, size_t index) {