Skip to content

Commit

Permalink
net,http2: merge setTimeout code
Browse files Browse the repository at this point in the history
PR-URL: #25084
Refs: #19060
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
  • Loading branch information
ZYSzys authored and addaleax committed Jan 27, 2019
1 parent bb774b1 commit 802ea05
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 65 deletions.
41 changes: 5 additions & 36 deletions lib/internal/http2/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,11 @@ const {
onStreamRead,
kAfterAsyncWrite,
kMaybeDestroy,
kUpdateTimer
kUpdateTimer,
kSession,
setStreamTimeout
} = require('internal/stream_base_commons');
const {
kTimeout,
setUnrefTimeout,
validateTimerDuration
} = require('internal/timers');
const { kTimeout } = require('internal/timers');
const { isArrayBufferView } = require('internal/util/types');

const { FileHandle } = internalBinding('fs');
Expand Down Expand Up @@ -163,7 +161,6 @@ const kSelectPadding = Symbol('select-padding');
const kSentHeaders = Symbol('sent-headers');
const kSentTrailers = Symbol('sent-trailers');
const kServer = Symbol('server');
const kSession = Symbol('session');
const kState = Symbol('state');
const kType = Symbol('type');
const kWriteGeneric = Symbol('write-generic');
Expand Down Expand Up @@ -2546,35 +2543,7 @@ const setTimeout = {
configurable: true,
enumerable: true,
writable: true,
value: function(msecs, callback) {
if (this.destroyed)
return;

// Type checking identical to timers.enroll()
msecs = validateTimerDuration(msecs);

// Attempt to clear an existing timer lear in both cases -
// even if it will be rescheduled we don't want to leak an existing timer.
clearTimeout(this[kTimeout]);

if (msecs === 0) {
if (callback !== undefined) {
if (typeof callback !== 'function')
throw new ERR_INVALID_CALLBACK();
this.removeListener('timeout', callback);
}
} else {
this[kTimeout] = setUnrefTimeout(this._onTimeout.bind(this), msecs);
if (this[kSession]) this[kSession][kUpdateTimer]();

if (callback !== undefined) {
if (typeof callback !== 'function')
throw new ERR_INVALID_CALLBACK();
this.once('timeout', callback);
}
}
return this;
}
value: setStreamTimeout
};
Object.defineProperty(Http2Stream.prototype, 'setTimeout', setTimeout);
Object.defineProperty(Http2Session.prototype, 'setTimeout', setTimeout);
Expand Down
47 changes: 46 additions & 1 deletion lib/internal/stream_base_commons.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,23 @@ const {
streamBaseState
} = internalBinding('stream_wrap');
const { UV_EOF } = internalBinding('uv');
const { errnoException } = require('internal/errors');
const {
codes: {
ERR_INVALID_CALLBACK
},
errnoException
} = require('internal/errors');
const { owner_symbol } = require('internal/async_hooks').symbols;
const {
kTimeout,
setUnrefTimeout,
validateTimerDuration
} = require('internal/timers');

const kMaybeDestroy = Symbol('kMaybeDestroy');
const kUpdateTimer = Symbol('kUpdateTimer');
const kAfterAsyncWrite = Symbol('kAfterAsyncWrite');
const kSession = Symbol('session');

function handleWriteReq(req, data, encoding) {
const { handle } = req;
Expand Down Expand Up @@ -178,6 +189,38 @@ function onStreamRead(arrayBuffer) {
}
}

function setStreamTimeout(msecs, callback) {
if (this.destroyed)
return;

this.timeout = msecs;

// Type checking identical to timers.enroll()
msecs = validateTimerDuration(msecs);

// Attempt to clear an existing timer in both cases -
// even if it will be rescheduled we don't want to leak an existing timer.
clearTimeout(this[kTimeout]);

if (msecs === 0) {
if (callback !== undefined) {
if (typeof callback !== 'function')
throw new ERR_INVALID_CALLBACK();
this.removeListener('timeout', callback);
}
} else {
this[kTimeout] = setUnrefTimeout(this._onTimeout.bind(this), msecs);
if (this[kSession]) this[kSession][kUpdateTimer]();

if (callback !== undefined) {
if (typeof callback !== 'function')
throw new ERR_INVALID_CALLBACK();
this.once('timeout', callback);
}
}
return this;
}

module.exports = {
createWriteWrap,
writevGeneric,
Expand All @@ -186,4 +229,6 @@ module.exports = {
kAfterAsyncWrite,
kMaybeDestroy,
kUpdateTimer,
kSession,
setStreamTimeout
};
32 changes: 4 additions & 28 deletions lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ const {
writeGeneric,
onStreamRead,
kAfterAsyncWrite,
kUpdateTimer
kUpdateTimer,
setStreamTimeout
} = require('internal/stream_base_commons');
const {
codes: {
Expand All @@ -89,11 +90,7 @@ const kLastWriteQueueSize = Symbol('lastWriteQueueSize');
let cluster;
let dns;

const {
kTimeout,
setUnrefTimeout,
validateTimerDuration
} = require('internal/timers');
const { kTimeout } = require('internal/timers');

function noop() {}

Expand Down Expand Up @@ -405,28 +402,7 @@ function writeAfterFIN(chunk, encoding, cb) {
}
}

Socket.prototype.setTimeout = function(msecs, callback) {
this.timeout = msecs;
// Type checking identical to timers.enroll()
msecs = validateTimerDuration(msecs);

// Attempt to clear an existing timer in both cases -
// even if it will be rescheduled we don't want to leak an existing timer.
clearTimeout(this[kTimeout]);

if (msecs === 0) {
if (callback) {
this.removeListener('timeout', callback);
}
} else {
this[kTimeout] = setUnrefTimeout(this._onTimeout.bind(this), msecs);

if (callback) {
this.once('timeout', callback);
}
}
return this;
};
Socket.prototype.setTimeout = setStreamTimeout;


Socket.prototype._onTimeout = function() {
Expand Down

0 comments on commit 802ea05

Please sign in to comment.