From f2338c8f3beb069d3fa7e4ba0d56be1cc6e065f5 Mon Sep 17 00:00:00 2001 From: Marek Chalupa Date: Tue, 12 Aug 2014 11:35:06 +0200 Subject: [PATCH] event-loop: make signalfd non-blocking When we add more that one source to a signal, then wayland will block in wl_event_loop_dispatch. This is due to the attampt to read from signal's fd each time the source is dispatched. wl_event_loop_add_signal(loop, SIGINT, ...); wl_event_loop_add_signal(loop, SIGINT, ...); /* raise signal .. */ /* we got two fd's ready, both for the one SIGINT */ epoll_wait(...) = 2 [ for (i == 0) ] source1->dispatch() --> read(fd1); [ for (i == 1) ] source2->dispatch() --> read(fd2); /* blocking! */ Reading from fd2 will block, because we got only one signal, and it was read from fd1. Signed-off-by: Marek Chalupa Reviewed-by: Pekka Paalanen --- src/event-loop.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/event-loop.c b/src/event-loop.c index 9790cde..a149db9 100644 --- a/src/event-loop.c +++ b/src/event-loop.c @@ -233,7 +233,7 @@ wl_event_source_signal_dispatch(struct wl_event_source *source, int len; len = read(source->fd, &signal_info, sizeof signal_info); - if (len != sizeof signal_info) + if (!(len == -1 && errno == EAGAIN) && len != sizeof signal_info) /* Is there anything we can do here? Will this ever happen? */ wl_log("signalfd read error: %m\n"); @@ -263,7 +263,7 @@ wl_event_loop_add_signal(struct wl_event_loop *loop, sigemptyset(&mask); sigaddset(&mask, signal_number); - source->base.fd = signalfd(-1, &mask, SFD_CLOEXEC); + source->base.fd = signalfd(-1, &mask, SFD_CLOEXEC | SFD_NONBLOCK); sigprocmask(SIG_BLOCK, &mask, NULL); source->func = func; -- 2.7.4