Browse Source

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>
v7.x
hveldstra 8 years ago
committed by Myles Borins
parent
commit
f66461382c
  1. 4
      lib/timers.js
  2. 23
      test/parallel/test-timers-regress-GH-9765.js

4
lib/timers.js

@ -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

@ -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…
Cancel
Save