diff options
author | Jeremiah Senkpiel <fishrock123@rocketmail.com> | 2018-04-25 12:45:34 -0400 |
---|---|---|
committer | Ujjwal Sharma <usharma1998@gmail.com> | 2018-05-10 22:19:27 +0530 |
commit | 46d335c380510fda68e62a4cdafa58e7e7b230a1 (patch) | |
tree | 6bf18decea35ca947eb61174de00e5b6335fbce5 | |
parent | d9425733931d86b41cbe0cb7f7f9940af4cbe8a5 (diff) | |
download | android-node-v8-46d335c380510fda68e62a4cdafa58e7e7b230a1.tar.gz android-node-v8-46d335c380510fda68e62a4cdafa58e7e7b230a1.tar.bz2 android-node-v8-46d335c380510fda68e62a4cdafa58e7e7b230a1.zip |
timers: make timer.refresh() a public API
Originally added in
bb5575aa75fd3071724d5eccde39a3041e1af57a
discussions such as
https://github.com/nodejs/node/issues/20261
show the usefulness of this API to the Node.js ecosystem.
PR-URL: https://github.com/nodejs/node/pull/20298
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Ujjwal Sharma <usharma1998@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
-rw-r--r-- | doc/api/timers.md | 15 | ||||
-rw-r--r-- | lib/internal/http2/core.js | 7 | ||||
-rw-r--r-- | lib/internal/timers.js | 6 | ||||
-rw-r--r-- | lib/net.js | 5 | ||||
-rw-r--r-- | test/parallel/test-timers-refresh.js | 25 |
5 files changed, 44 insertions, 14 deletions
diff --git a/doc/api/timers.md b/doc/api/timers.md index 376b5312e5..c573d2afdb 100644 --- a/doc/api/timers.md +++ b/doc/api/timers.md @@ -74,6 +74,21 @@ When called, requests that the Node.js event loop *not* exit so long as the By default, all `Timeout` objects are "ref'ed", making it normally unnecessary to call `timeout.ref()` unless `timeout.unref()` had been called previously. +### timeout.refresh() +<!-- YAML +added: REPLACEME +--> + +* Returns: {Timeout} a reference to `timeout` + +Sets the timer's start time to the current time, and reschedules the timer to +call its callback at the previously specified duration adjusted to the current +time. This is useful for refreshing a timer without allocating a new +JavaScript object. + +Using this on a timer that has already called its callback will reactivate the +timer. + ### timeout.unref() <!-- YAML added: v0.9.1 diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index ede4f5d343..0efdf9c063 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -107,8 +107,7 @@ const { const { kTimeout, setUnrefTimeout, - validateTimerDuration, - refreshFnSymbol + validateTimerDuration } = require('internal/timers'); const { createWriteWrap, @@ -962,7 +961,7 @@ class Http2Session extends EventEmitter { [kUpdateTimer]() { if (this.destroyed) return; - if (this[kTimeout]) this[kTimeout][refreshFnSymbol](); + if (this[kTimeout]) this[kTimeout].refresh(); } // Sets the id of the next stream to be created by this Http2Session. @@ -1539,7 +1538,7 @@ class Http2Stream extends Duplex { if (this.destroyed) return; if (this[kTimeout]) - this[kTimeout][refreshFnSymbol](); + this[kTimeout].refresh(); if (this[kSession]) this[kSession][kUpdateTimer](); } diff --git a/lib/internal/timers.js b/lib/internal/timers.js index 26fc3f941b..801fce1cc3 100644 --- a/lib/internal/timers.js +++ b/lib/internal/timers.js @@ -19,7 +19,6 @@ const { // Timeout values > TIMEOUT_MAX are set to 1. const TIMEOUT_MAX = 2 ** 31 - 1; -const refreshFnSymbol = Symbol('refresh()'); const unrefedSymbol = Symbol('unrefed'); module.exports = { @@ -29,7 +28,6 @@ module.exports = { trigger_async_id_symbol, Timeout, initAsyncResource, - refreshFnSymbol, setUnrefTimeout, validateTimerDuration }; @@ -82,7 +80,7 @@ function Timeout(callback, after, args, isRepeat, isUnrefed) { initAsyncResource(this, 'Timeout'); } -Timeout.prototype[refreshFnSymbol] = function refresh() { +Timeout.prototype.refresh = function() { if (this._handle) { // Would be more ideal with uv_timer_again(), however that API does not // cause libuv's sorted timers data structure (a binary heap at the time @@ -93,6 +91,8 @@ Timeout.prototype[refreshFnSymbol] = function refresh() { } else { getTimers().active(this); } + + return this; }; function setUnrefTimeout(callback, after, arg1, arg2, arg3) { diff --git a/lib/net.js b/lib/net.js index b4936558a8..5537c472fe 100644 --- a/lib/net.js +++ b/lib/net.js @@ -89,8 +89,7 @@ const exceptionWithHostPort = errors.exceptionWithHostPort; const { kTimeout, setUnrefTimeout, - validateTimerDuration, - refreshFnSymbol + validateTimerDuration } = require('internal/timers'); function noop() {} @@ -325,7 +324,7 @@ util.inherits(Socket, stream.Duplex); Socket.prototype._unrefTimer = function _unrefTimer() { for (var s = this; s !== null; s = s._parent) { if (s[kTimeout]) - s[kTimeout][refreshFnSymbol](); + s[kTimeout].refresh(); } }; diff --git a/test/parallel/test-timers-refresh.js b/test/parallel/test-timers-refresh.js index 25a22329c0..2c47be8d8d 100644 --- a/test/parallel/test-timers-refresh.js +++ b/test/parallel/test-timers-refresh.js @@ -5,7 +5,7 @@ const common = require('../common'); const { strictEqual } = require('assert'); -const { setUnrefTimeout, refreshFnSymbol } = require('internal/timers'); +const { setUnrefTimeout } = require('internal/timers'); // Schedule the unrefed cases first so that the later case keeps the event loop // active. @@ -27,7 +27,7 @@ const { setUnrefTimeout, refreshFnSymbol } = require('internal/timers'); strictEqual(called, false, 'unref()\'d timer returned before check'); }), 1); - timer[refreshFnSymbol](); + strictEqual(timer.refresh(), timer); } // unref pooled timer @@ -41,7 +41,7 @@ const { setUnrefTimeout, refreshFnSymbol } = require('internal/timers'); strictEqual(called, false, 'unref pooled timer returned before check'); }), 1); - timer[refreshFnSymbol](); + strictEqual(timer.refresh(), timer); } // regular timer @@ -55,5 +55,22 @@ const { setUnrefTimeout, refreshFnSymbol } = require('internal/timers'); strictEqual(called, false, 'pooled timer returned before check'); }), 1); - timer[refreshFnSymbol](); + strictEqual(timer.refresh(), timer); +} + +// interval +{ + let called = 0; + const timer = setInterval(common.mustCall(() => { + called += 1; + if (called === 2) { + clearInterval(timer); + } + }, 2), 1); + + setTimeout(common.mustCall(() => { + strictEqual(called, 0, 'pooled timer returned before check'); + }), 1); + + strictEqual(timer.refresh(), timer); } |