diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2016-03-13 16:41:16 +0100 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2016-03-13 16:41:16 +0100 |
commit | 365aed456e7ce31ba08e7d46bbb2402afc8256cf (patch) | |
tree | 9bee218aeabe5e98628ead34c96e6d4f7b93af51 | |
parent | 1051ad555ac9ac98a41aa0efa675ce4a1d009e1c (diff) | |
download | liberty-365aed456e7ce31ba08e7d46bbb2402afc8256cf.tar.gz liberty-365aed456e7ce31ba08e7d46bbb2402afc8256cf.tar.xz liberty-365aed456e7ce31ba08e7d46bbb2402afc8256cf.zip |
Add poller_post_fork() for *BSD kqueue
-rw-r--r-- | liberty.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -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) { |