From fa46483fe203f56dccd6e122573857cc2c322220 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 11 Jul 2013 15:58:11 -0700 Subject: [PATCH] timers: setImmediate process full queue each turn Previously only one cb per turn of the event loop was processed at a time, which is not exactly what is meant by immediate fixes #5798 --- lib/timers.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/timers.js b/lib/timers.js index f4a6069..76a9cda 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -313,18 +313,24 @@ L.init(immediateQueue); function processImmediate() { - var immediate = L.shift(immediateQueue); + var queue = immediateQueue; - if (L.isEmpty(immediateQueue)) { - process._needImmediateCallback = false; - } - - if (immediate._onImmediate) { - if (immediate.domain) immediate.domain.enter(); + immediateQueue = {}; + L.init(immediateQueue); + while (L.isEmpty(queue) === false) { + var immediate = L.shift(queue); + var domain = immediate.domain; + if (domain) domain.enter(); immediate._onImmediate(); + if (domain) domain.exit(); + } - if (immediate.domain) immediate.domain.exit(); + // Only round-trip to C++ land if we have to. Calling clearImmediate() on an + // immediate that's in |queue| is okay. Worst case is we make a superfluous + // call to NeedImmediateCallbackSetter(). + if (L.isEmpty(immediateQueue)) { + process._needImmediateCallback = false; } } -- 2.7.4