aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-06-20 10:36:36 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-06-24 13:02:23 -0300
commitb00a37544c2d0662e251fd80033509cb6ed8ffe2 (patch)
treecc1857c1968f8a9fa9d8cb72e337a26bc2440920
parente1264412f80ac8bab15e8e960b93a30ca9254418 (diff)
downloadrneovim-b00a37544c2d0662e251fd80033509cb6ed8ffe2.tar.gz
rneovim-b00a37544c2d0662e251fd80033509cb6ed8ffe2.tar.bz2
rneovim-b00a37544c2d0662e251fd80033509cb6ed8ffe2.zip
event: Bail out of event_poll when any event is processed
The loop condition was set to only exit when user input is processed, but we must exit on any event to properly notify `event_poll` callers
-rw-r--r--src/nvim/os/event.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/nvim/os/event.c b/src/nvim/os/event.c
index 6723b97e0c..8b7bc53978 100644
--- a/src/nvim/os/event.c
+++ b/src/nvim/os/event.c
@@ -99,13 +99,9 @@ bool event_poll(int32_t ms)
// Run one event loop iteration, blocking for events if run_mode is
// UV_RUN_ONCE
uv_run(uv_default_loop(), run_mode);
- // Process immediate events outside uv_run since libuv event loop not
- // support recursion(processing events may cause a recursive event_poll
- // call)
- event_process(false);
} while (
// Continue running if ...
- !input_ready() && // we have no input
+ !event_process(false) && // we didn't process any immediate events
!event_has_deferred() && // no events are waiting to be processed
run_mode != UV_RUN_NOWAIT && // ms != 0
!timer_data.timed_out); // we didn't get a timeout
@@ -139,11 +135,13 @@ void event_push(Event event, bool deferred)
}
// Runs the appropriate action for each queued event
-void event_process(bool deferred)
+bool event_process(bool deferred)
{
+ bool processed_events = false;
Event event;
while (kl_shift(Event, get_queue(deferred), &event) == 0) {
+ processed_events = true;
switch (event.type) {
case kEventSignal:
signal_handle(event);
@@ -158,6 +156,8 @@ void event_process(bool deferred)
abort();
}
}
+
+ return processed_events;
}
// Set a flag in the `event_poll` loop for signaling of a timeout