aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroni-link <knil.ino@gmail.com>2015-05-13 09:08:35 +0100
committerJustin M. Keyes <justinkz@gmail.com>2015-06-25 22:26:28 -0400
commit4aa6279a6bbaed0c6ea98ae5d04259df267ca292 (patch)
tree860b6171b44d898f4caf122c3f1bb11084143920 /src
parent568d9985491181b3fdfde58aec1f3ddd13e93345 (diff)
downloadrneovim-4aa6279a6bbaed0c6ea98ae5d04259df267ca292.tar.gz
rneovim-4aa6279a6bbaed0c6ea98ae5d04259df267ca292.tar.bz2
rneovim-4aa6279a6bbaed0c6ea98ae5d04259df267ca292.zip
event_teardown(): retry uv_loop_close() instead of abort. #2903
abort() causes a bad exit; retry uv_loop_close() instead. Before this change, this ruby script will cause nvim to abort() instead of exiting cleanly: ``` require 'open3' require 'base64' Open3.popen3('nvim --embed -u -NONE') {|stdin, stdout, stderr, wait_thr| # base64-encoded msgpack message for the vim_command "qa!". stdin.write Base64.decode64('kwKrdmltX2NvbW1hbmSRo3FhIQ==') puts wait_thr.value } ``` References ##2663 Closes #2466 Closes #2648 Helped-by: Rui Abreu Ferreira <raf-ep@gmx.com>
Diffstat (limited to 'src')
-rw-r--r--src/nvim/os/event.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/src/nvim/os/event.c b/src/nvim/os/event.c
index b0bd7ca55a..4c3a4581c3 100644
--- a/src/nvim/os/event.c
+++ b/src/nvim/os/event.c
@@ -69,24 +69,19 @@ 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();
channel_teardown();
job_teardown();
server_teardown();
signal_teardown();
terminal_teardown();
+
// this last `uv_run` will return after all handles are stopped, it will
// also take care of finishing any uv_close calls made by other *_teardown
// functions.
- uv_run(uv_default_loop(), UV_RUN_DEFAULT);
- // abort that if we left unclosed handles
- if (uv_loop_close(uv_default_loop())) {
- abort();
- }
+ do {
+ uv_run(uv_default_loop(), UV_RUN_DEFAULT);
+ } while (uv_loop_close(uv_default_loop()));
}
// Wait for some event