Skip to content

Commit

Permalink
timers: Move list.ontimeout to separate function
Browse files Browse the repository at this point in the history
  • Loading branch information
isaacs committed Dec 29, 2012
1 parent aec2f73 commit ba94f9d
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 50 deletions.
103 changes: 54 additions & 49 deletions lib/timers.js
Original file line number Diff line number Diff line change
Expand Up @@ -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];
}


Expand Down
2 changes: 1 addition & 1 deletion test/message/timeout_throw.out
Original file line number Diff line number Diff line change
Expand Up @@ -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:*:*)

0 comments on commit ba94f9d

Please sign in to comment.