From e0cec37d50b2fea9b6d8c79d52241afbf3d83c4e Mon Sep 17 00:00:00 2001 From: isaacs Date: Tue, 5 Mar 2013 17:53:37 -0800 Subject: [PATCH] stream: Remove unnecessary nextTick usage in Writable Fix #4928 --- lib/_stream_writable.js | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index bcbe88c11b..ba74f70c2a 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -240,31 +240,35 @@ function onwrite(stream, er) { if (er) onwriteError(stream, state, sync, er, cb); else { - if (!finishMaybe(stream, state)) { - if (state.length === 0 && state.needDrain) - onwriteDrain(stream, state); + var finished = finishMaybe(stream, state); - if (!state.bufferProcessing && state.buffer.length) - clearBuffer(stream, state); + if (!finished && !state.bufferProcessing && state.buffer.length) + clearBuffer(stream, state); + + if (sync) { + process.nextTick(function() { + afterWrite(stream, state, finished, cb); + }); + } else { + afterWrite(stream, state, finished, cb); } - - if (sync) - process.nextTick(cb); - else - cb(); } } +function afterWrite(stream, state, finished, cb) { + if (!finished) + onwriteDrain(stream, state); + cb(); +} + // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. function onwriteDrain(stream, state) { - process.nextTick(function() { - if (state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } - }); + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } }