diff options
Diffstat (limited to 'src/server.c')
-rw-r--r-- | src/server.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/server.c b/src/server.c index 5a3e6c5..e1b93cc 100644 --- a/src/server.c +++ b/src/server.c @@ -2,6 +2,7 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> +#include <signal.h> #include <sys/epoll.h> #include <pthread.h> #include <assert.h> @@ -110,6 +111,7 @@ int server_setup_epoll(server_ctx *ctx[], size_t siz) int server_mainloop_epoll(int epoll_fd, server_ctx *ctx[], size_t siz) { static struct epoll_event *events = NULL; + sigset_t eset; if (!events) events = (struct epoll_event *) calloc(POTD_MAXEVENTS, sizeof(*events)); @@ -118,10 +120,11 @@ int server_mainloop_epoll(int epoll_fd, server_ctx *ctx[], size_t siz) assert(ctx); assert(siz > 0 && siz < POTD_MAXFD); + sigemptyset(&eset); while (1) { int n, i; - n = epoll_wait(epoll_fd, events, POTD_MAXEVENTS, -1); + n = epoll_pwait(epoll_fd, events, POTD_MAXEVENTS, -1, &eset); if (n < 0) return 1; @@ -201,6 +204,7 @@ client_mainloop_epoll(void *arg) int s, epoll_fd, active = 1; struct epoll_event event = {0,{0}}; struct epoll_event *events; + sigset_t eset; assert(arg); args = (client_thread_args *) arg; @@ -222,10 +226,11 @@ client_mainloop_epoll(void *arg) goto finish; } + sigemptyset(&eset); while (active) { int n, i; - n = epoll_wait(epoll_fd, events, POTD_MAXEVENTS, -1); + n = epoll_pwait(epoll_fd, events, POTD_MAXEVENTS, -1, &eset); if (n < 0) break; @@ -236,7 +241,7 @@ client_mainloop_epoll(void *arg) !(events[i].events & EPOLLOUT))) { E("Epoll for descriptor %d failed", events[i].data.fd); - E_STRERR("epoll_wait"); + E_STRERR("epoll_pwait"); close(events[i].data.fd); continue; } else { |