aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Hillegeer <nicolas@hillegeer.com>2016-09-01 23:24:34 +0200
committerJustin M. Keyes <justinkz@gmail.com>2016-09-03 19:16:23 -0400
commita9c5423263d876d2ff65b18b81ee3b323bf0577d (patch)
treee97659217bfbd63cbb31ab79f5453123992a4f30
parent2f6d3e599b3659dff3d62ecfc31066e93523e169 (diff)
downloadrneovim-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.c35
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
-}