From ac869996e15b0fc9f284ce0e89aeff1fb57a1656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Tue, 27 Jan 2015 13:40:40 +0100 Subject: [PATCH] watchdog: fix timeout not running if polling returned early Switch from running the loop with UV_RUN_ONCE to UV_RUN_DEFAULT, because it's possible that the poll returns earlier than expected and thus the timer is not run on a single interation. The loop is not stopped either from the timer callback or from the async handle's. --- src/node_watchdog.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/node_watchdog.cc b/src/node_watchdog.cc index 5789a5e47171cc..2811ab06ed3abf 100644 --- a/src/node_watchdog.cc +++ b/src/node_watchdog.cc @@ -65,8 +65,9 @@ void Watchdog::Destroy() { void Watchdog::Run(void* arg) { Watchdog* wd = static_cast(arg); - // UV_RUN_ONCE so async_ or timer_ wakeup exits uv_run() call. - uv_run(wd->loop_, UV_RUN_ONCE); + // UV_RUN_DEFAULT the loop will be stopped either by the async or the + // timer handle. + uv_run(wd->loop_, UV_RUN_DEFAULT); // Loop ref count reaches zero when both handles are closed. // Close the timer handle on this side and let Destroy() close async_ @@ -75,11 +76,14 @@ void Watchdog::Run(void* arg) { void Watchdog::Async(uv_async_t* async) { + Watchdog* w = ContainerOf(&Watchdog::async_, async); + uv_stop(w->loop_); } void Watchdog::Timer(uv_timer_t* timer) { Watchdog* w = ContainerOf(&Watchdog::timer_, timer); + uv_stop(w->loop_); V8::TerminateExecution(w->env()->isolate()); }