Skip to content

Commit

Permalink
child_process: optimize IPC for large data
Browse files Browse the repository at this point in the history
Squashed from:
- child_process: stop indexOf() on whole IPC buffer
- child_process: get rid of forEach() and slice() in IPC
- child_process: get rid of another forEach() in IPC

Fixes: nodejs#3145
PR-URL: nodejs#10557
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information
ypresto authored and italoacasas committed Jan 27, 2017
1 parent 2f339e7 commit ddcd1a2
Showing 1 changed file with 17 additions and 12 deletions.
29 changes: 17 additions & 12 deletions lib/internal/child_process.js
Original file line number Diff line number Diff line change
Expand Up @@ -446,14 +446,20 @@ function setupChannel(target, channel) {
channel.onread = function(nread, pool, recvHandle) {
// TODO(bnoordhuis) Check that nread > 0.
if (pool) {
jsonBuffer += decoder.write(pool);

var i, start = 0;
// Linebreak is used as a message end sign
var chunks = decoder.write(pool).split('\n');
var numCompleteChunks = chunks.length - 1;
// Last line does not have trailing linebreak
var incompleteChunk = chunks[numCompleteChunks];
if (numCompleteChunks === 0) {
jsonBuffer += incompleteChunk;
this.buffering = jsonBuffer.length !== 0;
return;
}
chunks[0] = jsonBuffer + chunks[0];

//Linebreak is used as a message end sign
while ((i = jsonBuffer.indexOf('\n', start)) >= 0) {
var json = jsonBuffer.slice(start, i);
var message = JSON.parse(json);
for (var i = 0; i < numCompleteChunks; i++) {
var message = JSON.parse(chunks[i]);

// There will be at most one NODE_HANDLE message in every chunk we
// read because SCM_RIGHTS messages don't get coalesced. Make sure
Expand All @@ -462,10 +468,8 @@ function setupChannel(target, channel) {
handleMessage(target, message, recvHandle);
else
handleMessage(target, message, undefined);

start = i + 1;
}
jsonBuffer = jsonBuffer.slice(start);
jsonBuffer = incompleteChunk;
this.buffering = jsonBuffer.length !== 0;

} else {
Expand Down Expand Up @@ -494,9 +498,10 @@ function setupChannel(target, channel) {
var queue = target._handleQueue;
target._handleQueue = null;

queue.forEach(function(args) {
for (var i = 0; i < queue.length; i++) {
var args = queue[i];
target._send(args.message, args.handle, args.options, args.callback);
});
}

// Process a pending disconnect (if any).
if (!target.connected && target.channel && !target._handleQueue)
Expand Down

0 comments on commit ddcd1a2

Please sign in to comment.