aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c11
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 {