-
Notifications
You must be signed in to change notification settings - Fork 30k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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: #9606 Fixes: #9561 PR-URL: #9685 Reviewed-By: Rich Trott <rtrott@gmail.com>
- Loading branch information
1 parent
fa98eec
commit 02c2bf7
Showing
2 changed files
with
63 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
'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); |