Skip to content

Commit

Permalink
timers: set _destroyed even if there are no destroy-hooks
Browse files Browse the repository at this point in the history
Required for other potential changes.

This should make it so we can always just check _destroyed to
check if a timer has been ended.

PR-URL: #29595
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
  • Loading branch information
Fishrock123 authored and BridgeAR committed Sep 25, 2019
1 parent 322bc6f commit b43d2dd
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/internal/timers.js
Original file line number Diff line number Diff line change
Expand Up @@ -544,8 +544,8 @@ function getTimerCallbacks(runNextTicks) {

if (destroyHooksExist() && !timer._destroyed) {
emitDestroy(timer[async_id_symbol]);
timer._destroyed = true;
}
timer._destroyed = true;
}
}

Expand Down
2 changes: 1 addition & 1 deletion lib/timers.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
27 changes: 27 additions & 0 deletions test/parallel/test-timers-destroyed.js
Original file line number Diff line number Diff line change
@@ -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);
});

0 comments on commit b43d2dd

Please sign in to comment.