Skip to content

Commit

Permalink
Fix bug in process._tickCallback where callbacks can get abandoned.
Browse files Browse the repository at this point in the history
Change process._tickCallback so that if a callback throws an error but
there are other callbacks after it, we indicate that
process._tickCallback needs to be ran again.

Currently, if a callback in process._tickCallback throws an error, and
that error is caught by an uncaughtException handler and
process.nextTick is never called again, then any other callbacks already
added to the nextTickQueue won't be called again.

Updated the next-tick-errors test to catch this scenario.
  • Loading branch information
Benjamin Thomas authored and ry committed Sep 9, 2010
1 parent b2dfea0 commit b30b607
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 9 deletions.
5 changes: 4 additions & 1 deletion src/node.js
Expand Up @@ -52,11 +52,14 @@ process._tickCallback = function () {

try {
for (var i = 0; i < l; i++) {
nextTickQueue[i]();
nextTickQueue[i]();
}
}
catch(e) {
nextTickQueue.splice(0, i+1);
if (i+1 < l) {
process._needTickCallback();
}
throw e;
}

Expand Down
11 changes: 3 additions & 8 deletions test/simple/test-next-tick-errors.js
Expand Up @@ -13,7 +13,8 @@ process.nextTick(function() {
});

// This nextTick function should remain in the queue when the first one
// is removed.
// is removed. It should be called if the error in the first one is
// caught (which we do in this test).
process.nextTick(function() {
order.push('C');
});
Expand All @@ -22,12 +23,6 @@ process.addListener('uncaughtException', function() {
if (!exceptionHandled) {
exceptionHandled = true;
order.push('B');
// We call process.nextTick here to make sure the nextTick queue is
// processed again. If everything goes according to plan then when the queue
// gets ran there will be two functions with this being the second.
process.nextTick(function() {
order.push('D');
});
}
else {
// If we get here then the first process.nextTick got called twice
Expand All @@ -36,6 +31,6 @@ process.addListener('uncaughtException', function() {
});

process.addListener('exit', function() {
assert.deepEqual(['A','B','C','D'], order);
assert.deepEqual(['A','B','C'], order);
});

0 comments on commit b30b607

Please sign in to comment.