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.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/nvim/os/signal.c b/src/nvim/os/signal.c
index 36f7b37c48..cf8ba85ed5 100644
--- a/src/nvim/os/signal.c
+++ b/src/nvim/os/signal.c
@@ -2,6 +2,8 @@
#include <uv.h>
+#include "nvim/lib/klist.h"
+
#include "nvim/types.h"
#include "nvim/ascii.h"
#include "nvim/vim.h"
@@ -13,6 +15,11 @@
#include "nvim/misc1.h"
#include "nvim/misc2.h"
#include "nvim/os/signal.h"
+#include "nvim/os/event.h"
+
+#define SignalEventFreer(x)
+KMEMPOOL_INIT(SignalEventPool, int, SignalEventFreer)
+kmempool_t(SignalEventPool) *signal_event_pool = NULL;
static uv_signal_t sint, spipe, shup, squit, sterm, swinch;
#ifdef SIGPWR
@@ -26,6 +33,7 @@ static bool rejecting_deadly;
#endif
void signal_init(void)
{
+ signal_event_pool = kmp_init(SignalEventPool);
uv_signal_init(uv_default_loop(), &sint);
uv_signal_init(uv_default_loop(), &spipe);
uv_signal_init(uv_default_loop(), &shup);
@@ -47,6 +55,20 @@ void signal_init(void)
#endif
}
+void signal_teardown(void)
+{
+ signal_stop();
+ uv_close((uv_handle_t *)&sint, NULL);
+ uv_close((uv_handle_t *)&spipe, NULL);
+ uv_close((uv_handle_t *)&shup, NULL);
+ uv_close((uv_handle_t *)&squit, NULL);
+ uv_close((uv_handle_t *)&sterm, NULL);
+ uv_close((uv_handle_t *)&swinch, NULL);
+#ifdef SIGPWR
+ uv_close((uv_handle_t *)&spwr, NULL);
+#endif
+}
+
void signal_stop(void)
{
uv_signal_stop(&sint);
@@ -113,6 +135,19 @@ static void deadly_signal(int signum)
static void signal_cb(uv_signal_t *handle, int signum)
{
+ int *n = kmp_alloc(SignalEventPool, signal_event_pool);
+ *n = signum;
+ event_push((Event) {
+ .handler = on_signal_event,
+ .data = n
+ }, false);
+}
+
+static void on_signal_event(Event event)
+{
+ int signum = *((int *)event.data);
+ kmp_free(SignalEventPool, signal_event_pool, event.data);
+
switch (signum) {
case SIGINT:
got_int = true;
@@ -142,3 +177,4 @@ static void signal_cb(uv_signal_t *handle, int signum)
break;
}
}
+