Skip to content

Commit 7171bd6

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: #9086Fixes: #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>
1 parent 2540417 commit 7171bd6

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

‎lib/timers.js‎

Lines changed: 10 additions & 1 deletion
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+
varnext=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
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
require('../common');
3+
constassert=require('assert');
4+
5+
constN=3;
6+
varcount=0;
7+
functionnext(){
8+
constimmediate=setImmediate(function(){
9+
clearImmediate(immediate);
10+
++count;
11+
});
12+
}
13+
for(vari=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)