From 57e80a7769f944a2f8ecadf3a83f98b11e3f566b Mon Sep 17 00:00:00 2001 From: Jeremiah Senkpiel Date: Tue, 17 Sep 2019 16:20:09 -0700 Subject: [PATCH] timers: always set _destroyed Required for other potential changes. This should make it so we can always just check _destroyed to check if a timer has been ended. --- lib/internal/timers.js | 2 +- lib/timers.js | 2 +- test/parallel/test-timers-destroyed.js | 27 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 test/parallel/test-timers-destroyed.js diff --git a/lib/internal/timers.js b/lib/internal/timers.js index 2d86b2203c020e..bb1888198165fb 100644 --- a/lib/internal/timers.js +++ b/lib/internal/timers.js @@ -544,8 +544,8 @@ function getTimerCallbacks(runNextTicks) { if (destroyHooksExist() && !timer._destroyed) { emitDestroy(timer[async_id_symbol]); - timer._destroyed = true; } + timer._destroyed = true; } } diff --git a/lib/timers.js b/lib/timers.js index 98acbf8fa44152..f7fd157b3284ef 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -65,8 +65,8 @@ function unenroll(item) { item[async_id_symbol] !== undefined && !item._destroyed) { emitDestroy(item[async_id_symbol]); - item._destroyed = true; } + item._destroyed = true; L.remove(item); diff --git a/test/parallel/test-timers-destroyed.js b/test/parallel/test-timers-destroyed.js new file mode 100644 index 00000000000000..b11f93b9ff4e2c --- /dev/null +++ b/test/parallel/test-timers-destroyed.js @@ -0,0 +1,27 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +// We don't really care about the calling results here. +// So, this makes the test less fragile. +const noop = () => {}; + +const t1 = setTimeout(common.mustNotCall(), 1); +const t2 = setTimeout(common.mustCall(), 1); +const i1 = setInterval(common.mustNotCall(), 1); +const i2 = setInterval(noop, 1); +i2.unref(); + +// Keep process alive for i2 to call once due to timer ordering. +setTimeout(common.mustCall(), 1); + +clearTimeout(t1); +clearInterval(i1); + +process.on('exit', () => { + assert.strictEqual(t1._destroyed, true); + assert.strictEqual(t2._destroyed, true); + assert.strictEqual(i1._destroyed, true); + assert.strictEqual(i2._destroyed, false); +});