diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2017-06-07 23:19:02 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-07 23:19:02 +0200 |
commit | 16cce1ac17456e3758f95af6ce7289bade3bb285 (patch) | |
tree | 1e5bc9c076e6a49dcc750cb686c45a0e371b3a31 /src/nvim/event/loop.c | |
parent | d3d0c9a7b11cad3f277f732dee6c782d1d911b48 (diff) | |
parent | bc025ab117c92418f890085dc13f26cb7c976772 (diff) | |
download | rneovim-16cce1ac17456e3758f95af6ce7289bade3bb285.tar.gz rneovim-16cce1ac17456e3758f95af6ce7289bade3bb285.tar.bz2 rneovim-16cce1ac17456e3758f95af6ce7289bade3bb285.zip |
Merge #6827 'Always enable logging'
Diffstat (limited to 'src/nvim/event/loop.c')
-rw-r--r-- | src/nvim/event/loop.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/nvim/event/loop.c b/src/nvim/event/loop.c index c709ce9a1c..25701a1621 100644 --- a/src/nvim/event/loop.c +++ b/src/nvim/event/loop.c @@ -8,6 +8,7 @@ #include "nvim/event/loop.h" #include "nvim/event/process.h" +#include "nvim/log.h" #ifdef INCLUDE_GENERATED_DECLARATIONS # include "event/loop.c.generated.h" @@ -78,20 +79,34 @@ void loop_on_put(MultiQueue *queue, void *data) uv_stop(&loop->uv); } -void loop_close(Loop *loop, bool wait) +/// @returns false if the loop could not be closed gracefully +bool loop_close(Loop *loop, bool wait) { + bool rv = true; uv_mutex_destroy(&loop->mutex); 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, NULL); uv_close((uv_handle_t *)&loop->async, NULL); - do { + uint64_t start = wait ? os_hrtime() : 0; + while (true) { uv_run(&loop->uv, wait ? UV_RUN_DEFAULT : UV_RUN_NOWAIT); - } while (uv_loop_close(&loop->uv) && wait); + if (!uv_loop_close(&loop->uv) || !wait) { + break; + } + if (os_hrtime() - start >= 2 * 1000000000) { + // Some libuv resource was not correctly deref'd. Log and bail. + rv = false; + ELOG("uv_loop_close() hang?"); + log_uv_handles(&loop->uv); + break; + } + } multiqueue_free(loop->fast_events); multiqueue_free(loop->thread_events); multiqueue_free(loop->events); kl_destroy(WatcherPtr, loop->children); + return rv; } void loop_purge(Loop *loop) |