Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

net: Fix string-concat hot path bug

Also removes functionality added in f9fec3a
because it changes API. (That patch shouldn't have been added anyway.)
  • Loading branch information...
commit dea49e3d1900ffdc56a2077d1d701ec9e38bc58b 1 parent 942b92a
@ry ry authored
Showing with 70 additions and 6 deletions.
  1. +14 −6 lib/net.js
  2. +56 −0 test/simple/test-net-write-callbacks.js
View
20 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;
}
View
56 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);
+});
Please sign in to comment.
Something went wrong with that request. Please try again.