diff options
author | Anatoli Papirovski <apapirovski@mac.com> | 2017-11-29 12:46:13 -0500 |
---|---|---|
committer | Anatoli Papirovski <apapirovski@mac.com> | 2017-12-07 17:05:23 -0500 |
commit | e55b7d62863b7eae82e4afccf0b874e0f5ebba16 (patch) | |
tree | b4962e44ebeea838706ce1736e4255ba27e95862 /lib | |
parent | a413df40b67e1005b6c0c6d9e280bd7dcb53ee11 (diff) | |
download | android-node-v8-e55b7d62863b7eae82e4afccf0b874e0f5ebba16.tar.gz android-node-v8-e55b7d62863b7eae82e4afccf0b874e0f5ebba16.tar.bz2 android-node-v8-e55b7d62863b7eae82e4afccf0b874e0f5ebba16.zip |
timers: improvements to TimersList management
Move all the TimersList instantiation code into the constructor.
Compare values to undefined & null as appropriate instead of
truthy or falsy.
PR-URL: https://github.com/nodejs/node/pull/17429
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/timers.js | 55 |
1 files changed, 24 insertions, 31 deletions
diff --git a/lib/timers.js b/lib/timers.js index d0828669d7..c9202cc090 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -55,7 +55,7 @@ const activateImmediateCheck = process._activateImmediateCheck; delete process._activateImmediateCheck; // Timeout values > TIMEOUT_MAX are set to 1. -const TIMEOUT_MAX = 2147483647; // 2^31-1 +const TIMEOUT_MAX = 2 ** 31 - 1; // HOW and WHY the timers implementation works the way it does. @@ -173,9 +173,9 @@ function insert(item, unrefed) { // Use an existing list if there is one, otherwise we need to make a new one. var list = lists[msecs]; - if (!list) { + if (list === undefined) { debug('no %d list was found in insert, creating a new one', msecs); - lists[msecs] = list = createTimersList(msecs, unrefed); + lists[msecs] = list = new TimersList(msecs, unrefed); } if (!item[async_id_symbol] || item._destroyed) { @@ -194,28 +194,21 @@ function insert(item, unrefed) { assert(!L.isEmpty(list)); // list is not empty } -function createTimersList(msecs, unrefed) { - // Make a new linked list of timers, and create a TimerWrap to schedule - // processing for the list. - const list = new TimersList(msecs, unrefed); - L.init(list); - list._timer._list = list; - - if (unrefed === true) list._timer.unref(); - list._timer.start(msecs); - - list._timer[kOnTimeout] = listOnTimeout; - - return list; -} - function TimersList(msecs, unrefed) { - this._idleNext = null; // Create the list with the linkedlist properties to - this._idlePrev = null; // prevent any unnecessary hidden class changes. - this._timer = new TimerWrap(); + this._idleNext = this; // Create the list with the linkedlist properties to + this._idlePrev = this; // prevent any unnecessary hidden class changes. this._unrefed = unrefed; this.msecs = msecs; this.nextTick = false; + + const timer = this._timer = new TimerWrap(); + timer._list = this; + + if (unrefed === true) + timer.unref(); + timer.start(msecs); + + timer[kOnTimeout] = listOnTimeout; } function listOnTimeout() { @@ -359,7 +352,7 @@ function reuse(item) { var list = refedLists[item._idleTimeout]; // if empty - reuse the watcher - if (list && L.isEmpty(list)) { + if (list !== undefined && L.isEmpty(list)) { debug('reuse hit'); list._timer.stop(); delete refedLists[item._idleTimeout]; @@ -382,7 +375,7 @@ const unenroll = exports.unenroll = function(item) { } var handle = reuse(item); - if (handle) { + if (handle !== null) { debug('unenroll: list empty'); handle.close(); } @@ -610,7 +603,7 @@ Timeout.prototype.unref = function() { } var handle = reuse(this); - if (handle) { + if (handle !== null) { handle._list = undefined; } @@ -659,7 +652,7 @@ function ImmediateList() { // Appends an item to the end of the linked list, adjusting the current tail's // previous and next pointers where applicable ImmediateList.prototype.append = function(item) { - if (this.tail) { + if (this.tail !== null) { this.tail._idleNext = item; item._idlePrev = this.tail; } else { @@ -671,11 +664,11 @@ ImmediateList.prototype.append = function(item) { // Removes an item from the linked list, adjusting the pointers of adjacent // items and the linked list's head or tail pointers as necessary ImmediateList.prototype.remove = function(item) { - if (item._idleNext) { + if (item._idleNext !== null) { item._idleNext._idlePrev = item._idlePrev; } - if (item._idlePrev) { + if (item._idlePrev !== null) { item._idlePrev._idleNext = item._idleNext; } @@ -701,7 +694,7 @@ function processImmediate() { // immediate callbacks are executed immediateQueue.head = immediateQueue.tail = null; - while (immediate) { + while (immediate !== null) { domain = immediate.domain; if (!immediate._onImmediate) { @@ -722,7 +715,7 @@ function processImmediate() { // If `clearImmediate(immediate)` wasn't called from the callback, use the // `immediate`'s next item - if (immediate._idleNext) + if (immediate._idleNext !== null) immediate = immediate._idleNext; else immediate = next; @@ -754,11 +747,11 @@ function tryOnImmediate(immediate, oldTail) { } } - if (threw && immediate._idleNext) { + if (threw && immediate._idleNext !== null) { // Handle any remaining on next tick, assuming we're still alive to do so. const curHead = immediateQueue.head; const next = immediate._idleNext; - if (curHead) { + if (curHead !== null) { curHead._idlePrev = oldTail; oldTail._idleNext = curHead; next._idlePrev = null; |