From fa9aa1c961125f5c5527c7b5e3720eadf84a979f Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 29 May 2012 13:05:49 +0200 Subject: [PATCH] net: fix 'close' event emit order The server 'close' event was emitted before the last client 'close' event. Not exactly fatal but potentially confusing. Before this commit the order looked something like [client, server, client], now it looks like [client, client, server]. See #3340 for more details. --- lib/net.js | 10 ++++---- test/simple/test-net-server-close.js | 34 ++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/lib/net.js b/lib/net.js index 4930536304..16f3f72d98 100644 --- a/lib/net.js +++ b/lib/net.js @@ -342,11 +342,6 @@ Socket.prototype._destroy = function(exception, cb) { timers.unenroll(this); - if (this.server) { - this.server._connections--; - this.server._emitCloseIfDrained(); - } - debug('close'); if (this._handle) { this._handle.close(); @@ -361,6 +356,11 @@ Socket.prototype._destroy = function(exception, cb) { }); this.destroyed = true; + + if (this.server) { + this.server._connections--; + this.server._emitCloseIfDrained(); + } }; diff --git a/test/simple/test-net-server-close.js b/test/simple/test-net-server-close.js index c3036979f7..b87a84d96f 100644 --- a/test/simple/test-net-server-close.js +++ b/test/simple/test-net-server-close.js @@ -19,22 +19,36 @@ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. - - - var common = require('../common'); var assert = require('assert'); var net = require('net'); -var server = net.createServer(function(socket) { - server.close(function() { - assert.equal(server.connections, 0); - }); - process.nextTick(function() { - socket.destroy(); +var events = []; +var sockets = []; + +process.on('exit', function() { + assert.equal(server.connections, 0); + assert.deepEqual(events, 'client client server'.split(' ')); +}); + +var server = net.createServer(function(c) { + c.on('close', function() { + events.push('client'); }); + + sockets.push(c); + + if (sockets.length === 2) { + server.close(); + sockets.forEach(function(c) { c.destroy() }); + } +}); + +server.on('close', function() { + events.push('server'); }); server.listen(common.PORT, function() { net.createConnection(common.PORT); -}); \ No newline at end of file + net.createConnection(common.PORT); +});