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();
|
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
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