stream: use plain objects for write/corked reqs
This is similar to a change made awhile back for storing process.nextTick() requests. PR-URL: https://github.com/nodejs/node/pull/10558 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Evan Lucas <evanlucas@me.com>
This commit is contained in:
parent
b888bfe81d
commit
a3539ae3be
@ -16,13 +16,6 @@ util.inherits(Writable, Stream);
|
|||||||
|
|
||||||
function nop() {}
|
function nop() {}
|
||||||
|
|
||||||
function WriteReq(chunk, encoding, cb) {
|
|
||||||
this.chunk = chunk;
|
|
||||||
this.encoding = encoding;
|
|
||||||
this.callback = cb;
|
|
||||||
this.next = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function WritableState(options, stream) {
|
function WritableState(options, stream) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
|
|
||||||
@ -113,7 +106,9 @@ function WritableState(options, stream) {
|
|||||||
|
|
||||||
// allocate the first CorkedRequest, there is always
|
// allocate the first CorkedRequest, there is always
|
||||||
// one allocated and free to use, and we maintain at most two
|
// one allocated and free to use, and we maintain at most two
|
||||||
this.corkedRequestsFree = new CorkedRequest(this);
|
var corkReq = { next: null, entry: null, finish: undefined };
|
||||||
|
corkReq.finish = onCorkedFinish.bind(undefined, corkReq, this);
|
||||||
|
this.corkedRequestsFree = corkReq;
|
||||||
}
|
}
|
||||||
|
|
||||||
WritableState.prototype.getBuffer = function getBuffer() {
|
WritableState.prototype.getBuffer = function getBuffer() {
|
||||||
@ -304,7 +299,7 @@ function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
|
|||||||
|
|
||||||
if (state.writing || state.corked) {
|
if (state.writing || state.corked) {
|
||||||
var last = state.lastBufferedRequest;
|
var last = state.lastBufferedRequest;
|
||||||
state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
|
state.lastBufferedRequest = { chunk, encoding, callback: cb, next: null };
|
||||||
if (last) {
|
if (last) {
|
||||||
last.next = state.lastBufferedRequest;
|
last.next = state.lastBufferedRequest;
|
||||||
} else {
|
} else {
|
||||||
@ -423,7 +418,9 @@ function clearBuffer(stream, state) {
|
|||||||
state.corkedRequestsFree = holder.next;
|
state.corkedRequestsFree = holder.next;
|
||||||
holder.next = null;
|
holder.next = null;
|
||||||
} else {
|
} else {
|
||||||
state.corkedRequestsFree = new CorkedRequest(state);
|
var corkReq = { next: null, entry: null, finish: undefined };
|
||||||
|
corkReq.finish = onCorkedFinish.bind(undefined, corkReq, state);
|
||||||
|
state.corkedRequestsFree = corkReq;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Slow case, write chunks one-by-one
|
// Slow case, write chunks one-by-one
|
||||||
@ -528,14 +525,6 @@ function endWritable(stream, state, cb) {
|
|||||||
stream.writable = false;
|
stream.writable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// It seems a linked list but it is not
|
|
||||||
// there will be only 2 of these for each stream
|
|
||||||
function CorkedRequest(state) {
|
|
||||||
this.next = null;
|
|
||||||
this.entry = null;
|
|
||||||
this.finish = onCorkedFinish.bind(undefined, this, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
function onCorkedFinish(corkReq, state, err) {
|
function onCorkedFinish(corkReq, state, err) {
|
||||||
var entry = corkReq.entry;
|
var entry = corkReq.entry;
|
||||||
corkReq.entry = null;
|
corkReq.entry = null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user