summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2018-01-08 03:50:51 +0100
committerMyles Borins <mylesborins@google.com>2018-05-02 14:30:43 -0400
commit8b0a1b32de3e85c476edd3029a318703777c8519 (patch)
tree41210793cc33550cb5ddfbd2ed5a6a5d0580078a /lib
parent4e807d648e9793e7924c1e2706be55c9f7b610dd (diff)
downloadnode-new-8b0a1b32de3e85c476edd3029a318703777c8519.tar.gz
http2: refactor read mechanism
Refactor the read mechanism to completely avoid copying. Instead of copying individual `DATA` frame contents into buffers, create `ArrayBuffer` instances for all socket reads and emit slices of those `ArrayBuffer`s to JS. Backport-PR-URL: https://github.com/nodejs/node/pull/20456 PR-URL: https://github.com/nodejs/node/pull/18030 Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/internal/http2/core.js30
1 files changed, 12 insertions, 18 deletions
diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js
index 3e68ed4a59..bc1067e996 100644
--- a/lib/internal/http2/core.js
+++ b/lib/internal/http2/core.js
@@ -277,7 +277,7 @@ function submitRstStream(code) {
// point, close them. If there is an open fd for file send, close that also.
// At this point the underlying node::http2:Http2Stream handle is no
// longer usable so destroy it also.
-function onStreamClose(code, hasData) {
+function onStreamClose(code) {
const stream = this[kOwner];
if (stream.destroyed)
return;
@@ -285,8 +285,7 @@ function onStreamClose(code, hasData) {
const state = stream[kState];
debug(`Http2Stream ${stream[kID]} [Http2Session ` +
- `${sessionName(stream[kSession][kType])}]: closed with code ${code}` +
- ` [has data? ${hasData}]`);
+ `${sessionName(stream[kSession][kType])}]: closed with code ${code}`);
if (!stream.closed) {
// Unenroll from timeouts
@@ -304,13 +303,14 @@ function onStreamClose(code, hasData) {
if (state.fd !== undefined)
tryClose(state.fd);
- stream[kMaybeDestroy](null, code, hasData);
+ stream.push(null);
+ stream[kMaybeDestroy](null, code);
}
// Receives a chunk of data for a given stream and forwards it on
// to the Http2Stream Duplex for processing.
-function onStreamRead(nread, buf, handle) {
- const stream = handle[kOwner];
+function onStreamRead(nread, buf) {
+ const stream = this[kOwner];
if (nread >= 0 && !stream.destroyed) {
debug(`Http2Stream ${stream[kID]} [Http2Session ` +
`${sessionName(stream[kSession][kType])}]: receiving data chunk ` +
@@ -318,7 +318,7 @@ function onStreamRead(nread, buf, handle) {
stream[kUpdateTimer]();
if (!stream.push(buf)) {
if (!stream.destroyed) // we have to check a second time
- handle.readStop();
+ this.readStop();
}
return;
}
@@ -1427,13 +1427,8 @@ function streamOnResume() {
}
function streamOnPause() {
- // if (!this.destroyed && !this.pending)
- // this[kHandle].readStop();
-}
-
-function handleFlushData(self) {
if (!this.destroyed && !this.pending)
- this[kHandle].flushData();
+ this[kHandle].readStop();
}
// If the writable side of the Http2Stream is still open, emit the
@@ -1679,11 +1674,10 @@ class Http2Stream extends Duplex {
this.push(null);
return;
}
- const flushfn = handleFlushData.bind(this);
if (!this.pending) {
- flushfn();
+ streamOnResume.call(this);
} else {
- this.once('ready', flushfn);
+ this.once('ready', streamOnResume);
}
}
@@ -1822,10 +1816,10 @@ class Http2Stream extends Duplex {
// The Http2Stream can be destroyed if it has closed and if the readable
// side has received the final chunk.
- [kMaybeDestroy](error, code = NGHTTP2_NO_ERROR, hasData = true) {
+ [kMaybeDestroy](error, code = NGHTTP2_NO_ERROR) {
if (error == null) {
if (code === NGHTTP2_NO_ERROR &&
- ((!this._readableState.ended && hasData) ||
+ (!this._readableState.ended ||
!this._writableState.ended ||
this._writableState.pendingcb > 0 ||
!this.closed)) {