diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2015-03-24 12:00:56 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2015-03-25 18:57:35 -0300 |
commit | 6f471fa4fc24e72e1ac75c1579970414b168381e (patch) | |
tree | 21d81e86140823cf7db95dc2a6ca864070f89eca /src | |
parent | b16c5bf5e6e2b7fd5f592ccec4f17bbf937e6d9b (diff) | |
download | rneovim-6f471fa4fc24e72e1ac75c1579970414b168381e.tar.gz rneovim-6f471fa4fc24e72e1ac75c1579970414b168381e.tar.bz2 rneovim-6f471fa4fc24e72e1ac75c1579970414b168381e.zip |
event: Ensure the loop is stopped when a event is pushed.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/os/event.c | 10 |
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; } |