Skip to content

Instantly share code, notes, and snippets.

@ry
Created September 29, 2011 00:44
Show Gist options
  • Save ry/1249718 to your computer and use it in GitHub Desktop.
Save ry/1249718 to your computer and use it in GitHub Desktop.
From dea49e3d1900ffdc56a2077d1d701ec9e38bc58b Mon Sep 17 00:00:00 2001
From: Ryan Dahl <ry@tinyclouds.org>
Date: Wed, 28 Sep 2011 17:43:20 -0700
Subject: [PATCH] net: Fix string-concat hot path bug
Also removes functionality added in f9fec3a2d65580b7e39edc9afd5904cd4775c87c
because it changes API. (That patch shouldn't have been added anyway.)
---
lib/net.js | 20 ++++++++---
test/simple/test-net-write-callbacks.js | 56 +++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+), 6 deletions(-)
create mode 100644 test/simple/test-net-write-callbacks.js
diff --git a/lib/net.js b/lib/net.js
index 4af00b4..0e92ec1 100644
--- a/lib/net.js
+++ b/lib/net.js
@@ -349,11 +349,13 @@ Socket.prototype.write = function(data /* [encoding], [fd], [cb] */) {
if (!this._writeQueueCallbacks[last]) {
this._writeQueueCallbacks[last] = cb;
} else {
- // awful
- this._writeQueueCallbacks[last] = function() {
- this._writeQueueCallbacks[last]();
- cb();
- };
+ var original = this._writeQueueCallbacks[last];
+
+ if (Array.isArray(original)) {
+ original.push(cb);
+ } else {
+ this._writeQueueCallbacks[last] = [ original, cb ];
+ }
}
}
} else {
@@ -465,7 +467,13 @@ Socket.prototype._writeOut = function(data, encoding, fd, cb) {
return false;
} else {
if (cb) {
- process.nextTick(cb);
+ if (Array.isArray(cb)) {
+ for (var i = 0; i < cb.length; i++) {
+ if (cb[i]) cb[i]();
+ }
+ } else {
+ cb();
+ }
}
return true;
}
diff --git a/test/simple/test-net-write-callbacks.js b/test/simple/test-net-write-callbacks.js
new file mode 100644
index 0000000..c923e58
--- /dev/null
+++ b/test/simple/test-net-write-callbacks.js
@@ -0,0 +1,56 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// 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 net = require('net');
+var assert = require('assert');
+
+var cbcount = 0;
+var N = 500000;
+
+var server = net.Server(function(socket) {
+ socket.on('data', function(d) {
+ console.error("got %d bytes", d.length);
+ });
+
+ socket.on('end', function() {
+ console.error("end");
+ socket.destroy();
+ server.close();
+ });
+});
+
+server.listen(common.PORT, function() {
+ var client = net.createConnection(common.PORT);
+
+ client.on('connect', function() {
+ for (var i = 0; i < N; i++) {
+ client.write("hello world", function() {
+ cbcount++;
+ });
+ }
+ client.end();
+ });
+});
+
+process.on('exit', function() {
+ assert.equal(N, cbcount);
+});
--
1.7.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment