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) {
|
||||
domain = immediate.domain;
|
||||
|
||||
if (!immediate._onImmediate)
|
||||
if (!immediate._onImmediate) {
|
||||
immediate = immediate._idleNext;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (domain)
|
||||
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