timers: set _destroyed even if there are no destroy-hooks
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: https://github.com/nodejs/node/pull/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>
This commit is contained in:
parent
ec390b63a1
commit
a861b84d5d
@ -544,8 +544,8 @@ function getTimerCallbacks(runNextTicks) {
|
|||||||
|
|
||||||
if (destroyHooksExist() && !timer._destroyed) {
|
if (destroyHooksExist() && !timer._destroyed) {
|
||||||
emitDestroy(timer[async_id_symbol]);
|
emitDestroy(timer[async_id_symbol]);
|
||||||
timer._destroyed = true;
|
|
||||||
}
|
}
|
||||||
|
timer._destroyed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,8 +65,8 @@ function unenroll(item) {
|
|||||||
item[async_id_symbol] !== undefined &&
|
item[async_id_symbol] !== undefined &&
|
||||||
!item._destroyed) {
|
!item._destroyed) {
|
||||||
emitDestroy(item[async_id_symbol]);
|
emitDestroy(item[async_id_symbol]);
|
||||||
item._destroyed = true;
|
|
||||||
}
|
}
|
||||||
|
item._destroyed = true;
|
||||||
|
|
||||||
L.remove(item);
|
L.remove(item);
|
||||||
|
|
||||||
|
27
test/parallel/test-timers-destroyed.js
Normal file
27
test/parallel/test-timers-destroyed.js
Normal file
@ -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);
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user