Browse Source

timers: fix regression with clearImmediate()

This commit fixes a regression introduced in 0ed8839a27 that caused
additional queued immediate callbacks to be ignored if
`clearImmediate(immediate)` was called within the callback for
`immediate`.

PR-URL: https://github.com/nodejs/node/pull/9086
Fixes: https://github.com/nodejs/node/issues/9084
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Evan Lucas <evanlucas@me.com>
v6
Brian White 8 years ago
committed by Evan Lucas
parent
commit
42158a0313
  1. 11
      lib/timers.js
  2. 18
      test/parallel/test-timers-clearImmediate.js

11
lib/timers.js

@ -575,12 +575,21 @@ function processImmediate() {
domain.enter(); domain.enter();
immediate._callback = immediate._onImmediate; immediate._callback = immediate._onImmediate;
// Save next in case `clearImmediate(immediate)` is called from callback
var next = immediate._idleNext;
tryOnImmediate(immediate, tail); tryOnImmediate(immediate, tail);
if (domain) if (domain)
domain.exit(); domain.exit();
immediate = immediate._idleNext; // If `clearImmediate(immediate)` wasn't called from the callback, use the
// `immediate`'s next item
if (immediate._idleNext)
immediate = immediate._idleNext;
else
immediate = next;
} }
// Only round-trip to C++ land if we have to. Calling clearImmediate() on an // Only round-trip to C++ land if we have to. Calling clearImmediate() on an

18
test/parallel/test-timers-clearImmediate.js

@ -0,0 +1,18 @@
'use strict';
require('../common');
const assert = require('assert');
const N = 3;
var count = 0;
function next() {
const immediate = setImmediate(function() {
clearImmediate(immediate);
++count;
});
}
for (var i = 0; i < N; ++i)
next();
process.on('exit', () => {
assert.strictEqual(count, N, `Expected ${N} immediate callback executions`);
});
Loading…
Cancel
Save