diff options
Diffstat (limited to 'src/nvim/os/signal.c')
-rw-r--r-- | src/nvim/os/signal.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/nvim/os/signal.c b/src/nvim/os/signal.c index 4abc9cfc36..fc7f9cefd1 100644 --- a/src/nvim/os/signal.c +++ b/src/nvim/os/signal.c @@ -1,9 +1,16 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check +// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com + #include <assert.h> #include <stdbool.h> #include <uv.h> +#ifndef WIN32 +# include <signal.h> // for sigset_t +#endif #include "nvim/ascii.h" +#include "nvim/log.h" #include "nvim/vim.h" #include "nvim/globals.h" #include "nvim/memline.h" @@ -11,7 +18,6 @@ #include "nvim/main.h" #include "nvim/memory.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/event/signal.h" #include "nvim/os/signal.h" #include "nvim/event/loop.h" @@ -29,6 +35,16 @@ static bool rejecting_deadly; void signal_init(void) { +#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); signal_watcher_init(&main_loop, &squit, NULL); @@ -129,7 +145,7 @@ static void on_signal(SignalWatcher *handle, int signum, void *data) case SIGPWR: // Signal of a power failure(eg batteries low), flush the swap files to // be safe - ml_sync_all(false, false); + ml_sync_all(false, false, true); break; #endif #ifdef SIGPIPE @@ -147,7 +163,7 @@ static void on_signal(SignalWatcher *handle, int signum, void *data) } break; default: - fprintf(stderr, "Invalid signal %d", signum); + ELOG("invalid signal: %d", signum); break; } } |