Don't decrease server connection counter again if destroy() is called more than once
authorAndreas Reich <andreas@reich.name>
Wed, 8 Dec 2010 21:39:50 +0000 (13:39 -0800)
committerRyan Dahl <ry@tinyclouds.org>
Fri, 4 Mar 2011 23:45:12 +0000 (15:45 -0800)
Test: Anders Conbere <aconbere@gmail.com>
Fix: Andreas Reich <andreas@reich.name>

Closes GH-431.
Closes GH-502.

lib/net.js
test/simple/test-net-stream.js [new file with mode: 0644]

index d298e9a..ab4fd25 100644 (file)
@@ -172,7 +172,7 @@ function initSocket(self) {
   self._readWatcher = ioWatchers.alloc();
   self._readWatcher.socket = self;
   self._readWatcher.callback = onReadable;
-  self.readable = false;
+  self.readable = self.destroyed = false;
 
   // Queue of buffers and string that need to be written to socket.
   self._writeQueue = [];
@@ -788,7 +788,7 @@ Socket.prototype.destroy = function(exception) {
 
   timers.unenroll(this);
 
-  if (this.server) {
+  if (this.server && !this.destroyed) {
     this.server.connections--;
   }
 
@@ -802,6 +802,8 @@ Socket.prototype.destroy = function(exception) {
       self.emit('close', exception ? true : false);
     });
   }
+
+  this.destroyed = true;
 };
 
 
diff --git a/test/simple/test-net-stream.js b/test/simple/test-net-stream.js
new file mode 100644 (file)
index 0000000..f2dc4a8
--- /dev/null
@@ -0,0 +1,16 @@
+var common = require('../common');
+var assert = require('assert');
+
+var Stream = require('net').Stream;
+
+var s = new Stream();
+
+// test that destroy called on a stream with a server only ever decrements the
+// server connection count once
+
+s.server = { connections: 10 }
+assert.equal(10, s.server.connections);
+s.destroy()
+assert.equal(9, s.server.connections);
+s.destroy()
+assert.equal(9, s.server.connections);