aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/os/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/os/signal.c')
-rw-r--r--src/nvim/os/signal.c22
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;
}
}