mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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:
parent
2f6d3e599b
commit
a9c5423263
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user