node/test/parallel/test-timers-unenroll-unref-interval.js
Jeremiah Senkpiel 3f1e38c847 timers: use consistent checks for canceled timers
Previously not all codepaths set `timer._idleTimeout = -1` for canceled
or closed timers, and not all codepaths checked it either.

Unenroll uses this to say that a timer is indeed closed and it is the
closest thing there is to an authoritative source for this.

Refs: https://github.com/nodejs/node/pull/9606
Fixes: https://github.com/nodejs/node/issues/9561
PR-URL: https://github.com/nodejs/node/pull/9685
Reviewed-By: Rich Trott <rtrott@gmail.com>
2016-11-22 12:28:41 -05:00

50 lines
1.1 KiB
JavaScript

'use strict';
const common = require('../common');
const timers = require('timers');
{
const interval = setInterval(common.mustCall(() => {
clearTimeout(interval);
}), 1).unref();
}
{
const interval = setInterval(common.mustCall(() => {
interval.close();
}), 1).unref();
}
{
const interval = setInterval(common.mustCall(() => {
timers.unenroll(interval);
}), 1).unref();
}
{
const interval = setInterval(common.mustCall(() => {
interval._idleTimeout = -1;
}), 1).unref();
}
{
const interval = setInterval(common.mustCall(() => {
interval._onTimeout = null;
}), 1).unref();
}
// Use timers' intrinsic behavior to keep this open
// exactly long enough for the problem to manifest.
//
// See https://github.com/nodejs/node/issues/9561
//
// Since this is added after it will always fire later
// than the previous timeouts, unrefed or not.
//
// Keep the event loop alive for one timeout and then
// another. Any problems will occur when the second
// should be called but before it is able to be.
setTimeout(common.mustCall(() => {
setTimeout(common.mustCall(() => {}), 1);
}), 1);