summaryrefslogtreecommitdiff
path: root/js/src
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2015-09-17 20:36:57 +0200
committerJose <jose@zeroc.com>2015-09-17 20:36:57 +0200
commit7933b7e9d0362ac091d39d7a1198c8b295a73726 (patch)
tree704ce48de21e97fd2984c277e07f4432294ef5e0 /js/src
parentICE-6774 fixed iceboxadmin test to work with all protocols (diff)
downloadice-7933b7e9d0362ac091d39d7a1198c8b295a73726.tar.bz2
ice-7933b7e9d0362ac091d39d7a1198c8b295a73726.tar.xz
ice-7933b7e9d0362ac091d39d7a1198c8b295a73726.zip
Fix ICE-6784 - JavaScript throughput improvement
Diffstat (limited to 'js/src')
-rw-r--r--js/src/Ice/browser/WSTransceiver.js85
1 files changed, 39 insertions, 46 deletions
diff --git a/js/src/Ice/browser/WSTransceiver.js b/js/src/Ice/browser/WSTransceiver.js
index 2468c111220..df1b073d7b1 100644
--- a/js/src/Ice/browser/WSTransceiver.js
+++ b/js/src/Ice/browser/WSTransceiver.js
@@ -47,27 +47,19 @@ var WSTransceiver = Ice.Class({
this._readBuffers = [];
this._readPosition = 0;
this._maxSendPacketSize = instance.properties().getPropertyAsIntWithDefault("Ice.TCP.SndSize", 512 * 1024);
+ this._writeReadyTimeout = 0;
+ },
+ writeReadyTimeout: function()
+ {
+ var t = Math.round(this._writeReadyTimeout);
+ this._writeReadyTimeout += (this._writeReadyTimeout >= 5 ? 5 : 0.2);
+ return Math.min(t, 25);
},
setCallbacks: function(connectedCallback, bytesAvailableCallback, bytesWrittenCallback)
{
this._connectedCallback = connectedCallback;
this._bytesAvailableCallback = bytesAvailableCallback;
-
- var transceiver = this;
- this._bytesWrittenCallback = function(bytesSent, bytesTotal)
- {
- if(transceiver._fd)
- {
- if(transceiver._fd.bufferedAmount < 1024 || this._exception)
- {
- bytesWrittenCallback(bytesSent, bytesTotal);
- }
- else
- {
- Timer.setTimeout(function() { transceiver._bytesWrittenCallback(bytesSent, bytesTotal); }, 50);
- }
- }
- };
+ this._bytesWrittenCallback = bytesWrittenCallback;
},
//
// Returns SocketOperation.None when initialization is complete.
@@ -184,47 +176,48 @@ var WSTransceiver = Ice.Class({
return true;
}
- var transceiver = this;
- var bytesWrittenCallback = function()
- {
- transceiver._bytesWrittenCallback(0, 0);
- };
-
- if(this._fd.bufferedAmount > 1024)
- {
- Timer.setTimeout(bytesWrittenCallback, 50);
- return false;
- }
-
- var packetSize = byteBuffer.remaining;
- Debug.assert(packetSize > 0);
Debug.assert(this._fd);
- if(this._maxSendPacketSize > 0 && packetSize > this._maxSendPacketSize)
+ var transceiver = this;
+ var write = function()
{
- packetSize = this._maxSendPacketSize;
- }
+ if(transceiver.write(byteBuffer))
+ {
+ transceiver._bytesWrittenCallback(0, 0);
+ }
+ };
- while(packetSize > 0)
+ var bytesWrittenCallback = function()
{
- var slice = byteBuffer.b.slice(byteBuffer.position, byteBuffer.position + packetSize);
- this._fd.send(slice);
+ transceiver._bytesWrittenCallback(0, 0);
+ };
- byteBuffer.position = byteBuffer.position + packetSize;
- if(this._maxSendPacketSize > 0 && byteBuffer.remaining > this._maxSendPacketSize)
- {
- packetSize = this._maxSendPacketSize;
- }
- else
+ var i = byteBuffer.position;
+ while(true)
+ {
+ var packetSize = (this._maxSendPacketSize > 0 && byteBuffer.remaining > this._maxSendPacketSize) ?
+ this._maxSendPacketSize : byteBuffer.remaining;
+ if(byteBuffer.remaining === 0)
{
- packetSize = byteBuffer.remaining;
+ break;
}
-
- if(this._fd.bufferedAmount > 0 && packetSize > 0)
+ Debug.assert(packetSize > 0);
+ if(this._fd.bufferedAmount + packetSize > this._maxSendPacketSize)
{
- Timer.setTimeout(bytesWrittenCallback, 50);
+ if(byteBuffer.position - i > 0)
+ {
+ Timer.setTimeout(bytesWrittenCallback, this.writeReadyTimeout());
+ }
+ else
+ {
+ Timer.setTimeout(write, this.writeReadyTimeout());
+ }
return false;
}
+ this._writeReadyTimeout = 0;
+ var slice = byteBuffer.b.slice(byteBuffer.position, byteBuffer.position + packetSize);
+ this._fd.send(slice);
+ byteBuffer.position = byteBuffer.position + packetSize;
}
return true;
},