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>
This commit is contained in:
Nicolas Hillegeer 2016-09-01 23:24:34 +02:00 committed by Justin M. Keyes
parent 2f6d3e599b
commit a9c5423263

View File

@ -32,8 +32,15 @@ static bool rejecting_deadly;
void signal_init(void) void signal_init(void)
{ {
// Ensure that SIGCHLD is unblocked, else libuv (epoll_wait) may hang. #ifndef WIN32
signal_unblock_SIGCHLD(); // 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, &spipe, NULL);
signal_watcher_init(&main_loop, &shup, NULL); signal_watcher_init(&main_loop, &shup, NULL);
@ -157,27 +164,3 @@ static void on_signal(SignalWatcher *handle, int signum, void *data)
break; 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
}