aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/event/loop.c2
-rw-r--r--src/nvim/event/loop.h2
-rw-r--r--src/nvim/event/process.c2
-rw-r--r--src/nvim/globals.h2
-rw-r--r--src/nvim/msgpack_rpc/channel.c11
5 files changed, 19 insertions, 0 deletions
diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c
index f40573a0bc..1b5cc23b09 100644
--- a/src/nvim/event/loop.c
+++ b/src/nvim/event/loop.c
@@ -27,6 +27,7 @@ void loop_init(Loop *loop, void *data)
uv_signal_init(&loop->uv, &loop->children_watcher);
uv_timer_init(&loop->uv, &loop->children_kill_timer);
uv_timer_init(&loop->uv, &loop->poll_timer);
+ uv_timer_init(&loop->uv, &loop->exit_delay_timer);
loop->poll_timer.data = xmalloc(sizeof(bool)); // "timeout expired" flag
}
@@ -136,6 +137,7 @@ bool loop_close(Loop *loop, bool wait)
uv_close((uv_handle_t *)&loop->children_watcher, NULL);
uv_close((uv_handle_t *)&loop->children_kill_timer, NULL);
uv_close((uv_handle_t *)&loop->poll_timer, timer_close_cb);
+ uv_close((uv_handle_t *)&loop->exit_delay_timer, NULL);
uv_close((uv_handle_t *)&loop->async, NULL);
uint64_t start = wait ? os_hrtime() : 0;
bool didstop = false;
diff --git a/src/nvim/event/loop.h b/src/nvim/event/loop.h
index c0c5bc527f..65980c6c05 100644
--- a/src/nvim/event/loop.h
+++ b/src/nvim/event/loop.h
@@ -36,6 +36,8 @@ typedef struct loop {
// generic timer, used by loop_poll_events()
uv_timer_t poll_timer;
+ uv_timer_t exit_delay_timer;
+
uv_async_t async;
uv_mutex_t mutex;
int recursive;
diff --git a/src/nvim/event/process.c b/src/nvim/event/process.c
index 1ec11f1eb6..e029f778f6 100644
--- a/src/nvim/event/process.c
+++ b/src/nvim/event/process.c
@@ -386,11 +386,13 @@ static void process_close_handles(void **argv)
{
Process *proc = argv[0];
+ exit_need_delay++;
flush_stream(proc, &proc->out);
flush_stream(proc, &proc->err);
process_close_streams(proc);
process_close(proc);
+ exit_need_delay--;
}
static void on_process_exit(Process *proc)
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index 5c1d6867ce..b539d50784 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -1075,4 +1075,6 @@ typedef enum {
// Only filled for Win32.
EXTERN char windowsVersion[20] INIT(= { 0 });
+EXTERN int exit_need_delay INIT(= 0);
+
#endif // NVIM_GLOBALS_H
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c
index 388fa2584c..de01443313 100644
--- a/src/nvim/msgpack_rpc/channel.c
+++ b/src/nvim/msgpack_rpc/channel.c
@@ -532,8 +532,19 @@ void rpc_close(Channel *channel)
}
}
+static void exit_delay_cb(uv_timer_t *handle)
+{
+ uv_timer_stop(&main_loop.exit_delay_timer);
+ multiqueue_put(main_loop.fast_events, exit_event, 0);
+}
+
static void exit_event(void **argv)
{
+ if (exit_need_delay) {
+ uv_timer_start(&main_loop.exit_delay_timer, exit_delay_cb, 0, 0);
+ return;
+ }
+
if (!exiting) {
os_exit(0);
}