aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/os/event.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/nvim/os/event.c b/src/nvim/os/event.c
index c4d38c6a28..92a5205eaf 100644
--- a/src/nvim/os/event.c
+++ b/src/nvim/os/event.c
@@ -74,6 +74,10 @@ void event_teardown(void)
process_events_from(immediate_events);
process_events_from(deferred_events);
+ // reset the stop_flag to ensure `uv_run` below won't exit early. This hack
+ // is required because the `process_events_from` above may call `event_push`
+ // which will set the stop_flag to 1(uv_stop)
+ uv_default_loop()->stop_flag = 0;
input_stop_stdin();
channel_teardown();
job_teardown();
@@ -153,6 +157,12 @@ void event_disable_deferred(void)
// Queue an event
void event_push(Event event, bool deferred)
{
+ // Sometimes libuv will run pending callbacks(timer for example) before
+ // blocking for a poll. If this happens and the callback pushes a event to one
+ // of the queues, the event would only be processed after the poll
+ // returns(user hits a key for example). To avoid this scenario, we call
+ // uv_stop when a event is enqueued.
+ uv_stop(uv_default_loop());
*kl_pushp(Event, deferred ? deferred_events : immediate_events) = event;
}