From c37a50aa58a5516be16925e149a2487bf29ed5a8 Mon Sep 17 00:00:00 2001 From: Anatoli Papirovski Date: Sun, 17 Mar 2019 11:26:01 -0700 Subject: [PATCH 1/2] timers: fix refresh inside callback When `timers.refresh()` is called inside a callback, the timer would incorrectly end up unrefed and thus not keep the event loop alive. --- lib/internal/timers.js | 2 +- test/parallel/test-timers-refresh-in-callback.js | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-timers-refresh-in-callback.js diff --git a/lib/internal/timers.js b/lib/internal/timers.js index 074ad7d5566fcc..b44952cafefe57 100644 --- a/lib/internal/timers.js +++ b/lib/internal/timers.js @@ -469,7 +469,7 @@ function getTimerCallbacks(runNextTicks) { if (start === undefined) start = getLibuvNow(); insert(timer, timer[kRefed], start); - } else { + } else if (!timer._idleNext && !timer._idlePrev) { if (timer[kRefed]) refCount--; timer[kRefed] = null; diff --git a/test/parallel/test-timers-refresh-in-callback.js b/test/parallel/test-timers-refresh-in-callback.js new file mode 100644 index 00000000000000..8084355e3b808f --- /dev/null +++ b/test/parallel/test-timers-refresh-in-callback.js @@ -0,0 +1,16 @@ +// Flags: --expose-internals + +'use strict'; + +const common = require('../common'); + +// This test checks whether a refresh called inside the callback will keep +// the event loop alive to run the timer again. + +let didCall = false; +const timer = setTimeout(common.mustCall(() => { + if (!didCall) { + didCall = true; + timer.refresh(); + } +}, 2), 1); From a70719a7d1943bce97b7f5bd27c854e6bce60c10 Mon Sep 17 00:00:00 2001 From: Anatoli Papirovski Date: Sun, 17 Mar 2019 18:39:50 -0700 Subject: [PATCH 2/2] fixup test --- test/parallel/test-timers-refresh-in-callback.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/parallel/test-timers-refresh-in-callback.js b/test/parallel/test-timers-refresh-in-callback.js index 8084355e3b808f..df62512acd60b1 100644 --- a/test/parallel/test-timers-refresh-in-callback.js +++ b/test/parallel/test-timers-refresh-in-callback.js @@ -1,5 +1,3 @@ -// Flags: --expose-internals - 'use strict'; const common = require('../common');