diff options
author | Nicolas Hillegeer <nicolas@hillegeer.com> | 2016-09-01 23:24:34 +0200 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2016-09-03 19:16:23 -0400 |
commit | a9c5423263d876d2ff65b18b81ee3b323bf0577d (patch) | |
tree | e97659217bfbd63cbb31ab79f5453123992a4f30 | |
parent | 2f6d3e599b3659dff3d62ecfc31066e93523e169 (diff) | |
download | rneovim-a9c5423263d876d2ff65b18b81ee3b323bf0577d.tar.gz rneovim-a9c5423263d876d2ff65b18b81ee3b323bf0577d.tar.bz2 rneovim-a9c5423263d876d2ff65b18b81ee3b323bf0577d.zip |
signal_init: unblock all signals on startup. #5283
As discussed on #5243 and #5283.
Helped-by: John Szakmeister <john@szakmeister.net>
Helped-by: Justin M. Keyes <justinkz@gmail.com>
-rw-r--r-- | src/nvim/os/signal.c | 35 |
1 files 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 -} |