Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
  • Loading branch information
saghul committed Jan 27, 2015
commit ac869996e15b0fc9f284ce0e89aeff1fb57a1656
8 changes: 6 additions & 2 deletions src/node_watchdog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,9 @@ void Watchdog::Destroy() {
void Watchdog::Run(void* arg) {
Watchdog* wd = static_cast<Watchdog*>(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_
Expand All @@ -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());
}

Expand Down