Skip to content

Commit 42158a0

Browse files
mscdexevanlucas
authored andcommitted
timers: fix regression with clearImmediate()
This commit fixes a regression introduced in 0ed8839 that caused additional queued immediate callbacks to be ignored if `clearImmediate(immediate)` was called within the callback for `immediate`. PR-URL: #9086 Fixes: #9084 Reviewed-By: Rich Trott <[email protected]> Reviewed-By: Jeremiah Senkpiel <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Evan Lucas <[email protected]>
1 parent b16a97e commit 42158a0

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

lib/timers.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -575,12 +575,21 @@ function processImmediate() {
575575
domain.enter();
576576

577577
immediate._callback = immediate._onImmediate;
578+
579+
// Save next in case `clearImmediate(immediate)` is called from callback
580+
var next = immediate._idleNext;
581+
578582
tryOnImmediate(immediate, tail);
579583

580584
if (domain)
581585
domain.exit();
582586

583-
immediate = immediate._idleNext;
587+
// If `clearImmediate(immediate)` wasn't called from the callback, use the
588+
// `immediate`'s next item
589+
if (immediate._idleNext)
590+
immediate = immediate._idleNext;
591+
else
592+
immediate = next;
584593
}
585594

586595
// Only round-trip to C++ land if we have to. Calling clearImmediate() on an
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
require('../common');
3+
const assert = require('assert');
4+
5+
const N = 3;
6+
var count = 0;
7+
function next() {
8+
const immediate = setImmediate(function() {
9+
clearImmediate(immediate);
10+
++count;
11+
});
12+
}
13+
for (var i = 0; i < N; ++i)
14+
next();
15+
16+
process.on('exit', () => {
17+
assert.strictEqual(count, N, `Expected ${N} immediate callback executions`);
18+
});

0 commit comments

Comments
 (0)