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>
This commit is contained in:
parent
b16a97e042
commit
42158a0313
@ -575,12 +575,21 @@ function processImmediate() {
|
||||
domain.enter();
|
||||
|
||||
immediate._callback = immediate._onImmediate;
|
||||
|
||||
// Save next in case `clearImmediate(immediate)` is called from callback
|
||||
var next = immediate._idleNext;
|
||||
|
||||
tryOnImmediate(immediate, tail);
|
||||
|
||||
if (domain)
|
||||
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
|
||||
|
18
test/parallel/test-timers-clearImmediate.js
Normal file
18
test/parallel/test-timers-clearImmediate.js
Normal file
@ -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…
x
Reference in New Issue
Block a user