|
|
@ -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]; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|