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)
|
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
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user