Browse Source

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.
v0.9.1-release
Ben Noordhuis 13 years ago
parent
commit
fa9aa1c961
  1. 10
      lib/net.js
  2. 30
      test/simple/test-net-server-close.js

10
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();
}
};

30
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() {
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');
});
process.nextTick(function() {
socket.destroy();
});
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);
net.createConnection(common.PORT);
});
Loading…
Cancel
Save