From b255f4c10a80343f9ce1cee56d0288361429e214 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 20 Jun 2013 23:13:28 +0200 Subject: [PATCH] child_process: emit 'disconnect' asynchronously Deferring I/O-triggered events to the next event loop tick is not just a good idea, IT'S THE LAW! --- lib/child_process.js | 2 +- test/simple/test-child-process-disconnect.js | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/child_process.js b/lib/child_process.js index f731221..4b37350 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -498,7 +498,7 @@ function setupChannel(target, channel) { return; } - finish(); + process.nextTick(finish); }; channel.readStart(); diff --git a/test/simple/test-child-process-disconnect.js b/test/simple/test-child-process-disconnect.js index 162e7dd..301034c 100644 --- a/test/simple/test-child-process-disconnect.js +++ b/test/simple/test-child-process-disconnect.js @@ -27,6 +27,16 @@ var net = require('net'); // child if (process.argv[2] === 'child') { + // Check that the 'disconnect' event is deferred to the next event loop tick. + var disconnect = process.disconnect; + process.disconnect = function() { + disconnect.apply(this, arguments); + // If the event is emitted synchronously, we're too late by now. + process.once('disconnect', common.mustCall(disconnectIsNotAsync)); + // The funky function name makes it show up legible in mustCall errors. + function disconnectIsNotAsync() {} + }; + var server = net.createServer(); server.on('connection', function(socket) { -- 2.7.4