From ba94f9d6f8917377ce8a81c6c68666b692701803 Mon Sep 17 00:00:00 2001 From: isaacs Date: Thu, 27 Dec 2012 11:40:42 -0800 Subject: [PATCH] timers: Move list.ontimeout to separate function --- lib/timers.js | 103 +++++++++++++++++---------------- test/message/timeout_throw.out | 2 +- 2 files changed, 55 insertions(+), 50 deletions(-) diff --git a/lib/timers.js b/lib/timers.js index 8ec6b2c852..28c23c147e 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -66,60 +66,65 @@ function insert(item, msecs) { L.init(list); lists[msecs] = list; + list.msecs = msecs; + list.ontimeout = listOnTimeout; + } + + L.append(list, item); + assert(!L.isEmpty(list)); // list is not empty +} + +function listOnTimeout() { + var msecs = this.msecs; + var list = this; + + debug('timeout callback ' + msecs); - list.ontimeout = function() { - debug('timeout callback ' + msecs); - - var now = Date.now(); - debug('now: ' + (new Date(now))); - - var first; - while (first = L.peek(list)) { - var diff = now - first._idleStart; - if (diff + 1 < msecs) { - list.start(msecs - diff, 0); - debug(msecs + ' list wait because diff is ' + diff); - return; - } else { - L.remove(first); - assert(first !== L.peek(list)); - - if (!first._onTimeout) continue; - - // v0.4 compatibility: if the timer callback throws and the - // domain or uncaughtException handler ignore the exception, - // other timers that expire on this tick should still run. - // - // https://github.com/joyent/node/issues/2631 - var domain = first.domain; - if (domain && domain._disposed) continue; - try { - if (domain) - domain.enter(); - var threw = true; - first._onTimeout(); - if (domain) - domain.exit(); - threw = false; - } finally { - if (threw) { - process.nextTick(function() { - list.ontimeout(); - }); - } - } + var now = Date.now(); + debug('now: ' + now); + + var first; + while (first = L.peek(list)) { + var diff = now - first._idleStart; + if (diff + 1 < msecs) { + list.start(msecs - diff, 0); + debug(msecs + ' list wait because diff is ' + diff); + return; + } else { + L.remove(first); + assert(first !== L.peek(list)); + + if (!first._onTimeout) continue; + + // v0.4 compatibility: if the timer callback throws and the + // domain or uncaughtException handler ignore the exception, + // other timers that expire on this tick should still run. + // + // https://github.com/joyent/node/issues/2631 + var domain = first.domain; + if (domain && domain._disposed) continue; + try { + if (domain) + domain.enter(); + var threw = true; + first._onTimeout(); + if (domain) + domain.exit(); + threw = false; + } finally { + if (threw) { + process.nextTick(function() { + list.ontimeout(); + }); } } - - debug(msecs + ' list empty'); - assert(L.isEmpty(list)); - list.close(); - delete lists[msecs]; - }; + } } - L.append(list, item); - assert(!L.isEmpty(list)); // list is not empty + debug(msecs + ' list empty'); + assert(L.isEmpty(list)); + list.close(); + delete lists[msecs]; } diff --git a/test/message/timeout_throw.out b/test/message/timeout_throw.out index 44659b9a19..de8ce51a5b 100644 --- a/test/message/timeout_throw.out +++ b/test/message/timeout_throw.out @@ -3,5 +3,5 @@ ^ ReferenceError: undefined_reference_error_maker is not defined at null._onTimeout (*test*message*timeout_throw.js:*:*) - at Timer.list.ontimeout (timers.js:*:*) + at Timer.listOnTimeout [as ontimeout] (timers.js:*:*) at process._makeCallback (node.js:*:*)