From a9c5423263d876d2ff65b18b81ee3b323bf0577d Mon Sep 17 00:00:00 2001 From: Nicolas Hillegeer Date: Thu, 1 Sep 2016 23:24:34 +0200 Subject: [PATCH] signal_init: unblock all signals on startup. #5283 As discussed on #5243 and #5283. Helped-by: John Szakmeister Helped-by: Justin M. Keyes --- src/nvim/os/signal.c | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/src/nvim/os/signal.c b/src/nvim/os/signal.c index 5295fc03a1..411a9658bf 100644 --- a/src/nvim/os/signal.c +++ b/src/nvim/os/signal.c @@ -32,8 +32,15 @@ static bool rejecting_deadly; void signal_init(void) { - // Ensure that SIGCHLD is unblocked, else libuv (epoll_wait) may hang. - signal_unblock_SIGCHLD(); +#ifndef WIN32 + // Ensure a clean slate by unblocking all signals. For example, if SIGCHLD is + // blocked, libuv may hang after spawning a subprocess on Linux. #5230 + sigset_t mask; + sigemptyset(&mask); + if (pthread_sigmask(SIG_SETMASK, &mask, NULL) != 0) { + ELOG("Could not unblock signals, nvim might behave strangely."); + } +#endif signal_watcher_init(&main_loop, &spipe, NULL); signal_watcher_init(&main_loop, &shup, NULL); @@ -157,27 +164,3 @@ static void on_signal(SignalWatcher *handle, int signum, void *data) break; } } - -static void signal_unblock_SIGCHLD(void) -{ -#ifndef WIN32 - sigset_t mask; - sigemptyset(&mask); - - // Work around broken macOS headers. #5243 -# if defined(__APPLE__) && !defined(__clang__) && !defined(__INTEL_COMPILER) \ - && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsign-conversion" -# endif - - sigaddset(&mask, SIGCHLD); - -# if defined(__APPLE__) && !defined(__clang__) && !defined(__INTEL_COMPILER) \ - && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -# pragma GCC diagnostic pop -# endif - - pthread_sigmask(SIG_UNBLOCK, &mask, NULL); -#endif -}