timers: fix handling of cleared immediates
If current immediate has no callback, move on to the next one in the queue. Fixes: https://github.com/nodejs/node/issues/9756 PR-URL: https://github.com/nodejs/node/pull/9759 Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
This commit is contained in:
parent
75ac109998
commit
9f6f0f748c
@ -580,8 +580,10 @@ function processImmediate() {
|
|||||||
while (immediate) {
|
while (immediate) {
|
||||||
domain = immediate.domain;
|
domain = immediate.domain;
|
||||||
|
|
||||||
if (!immediate._onImmediate)
|
if (!immediate._onImmediate) {
|
||||||
|
immediate = immediate._idleNext;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (domain)
|
if (domain)
|
||||||
domain.enter();
|
domain.enter();
|
||||||
|
23
test/parallel/test-timers-regress-GH-9765.js
Normal file
23
test/parallel/test-timers-regress-GH-9765.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
'use strict';
|
||||||
|
const common = require('../common');
|
||||||
|
|
||||||
|
// This test ensures that if an Immediate callback clears subsequent
|
||||||
|
// immediates we don't get stuck in an infinite loop.
|
||||||
|
//
|
||||||
|
// If the process does get stuck, it will be timed out by the test
|
||||||
|
// runner.
|
||||||
|
//
|
||||||
|
// Ref: https://github.com/nodejs/node/issues/9756
|
||||||
|
|
||||||
|
setImmediate(common.mustCall(function() {
|
||||||
|
clearImmediate(i2);
|
||||||
|
clearImmediate(i3);
|
||||||
|
}));
|
||||||
|
|
||||||
|
const i2 = setImmediate(function() {
|
||||||
|
common.fail('immediate callback should not have fired');
|
||||||
|
});
|
||||||
|
|
||||||
|
const i3 = setImmediate(function() {
|
||||||
|
common.fail('immediate callback should not have fired');
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user