diff options
author | Jose <jose@zeroc.com> | 2015-09-17 20:36:57 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2015-09-17 20:36:57 +0200 |
commit | 7933b7e9d0362ac091d39d7a1198c8b295a73726 (patch) | |
tree | 704ce48de21e97fd2984c277e07f4432294ef5e0 /js/src | |
parent | ICE-6774 fixed iceboxadmin test to work with all protocols (diff) | |
download | ice-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.js | 85 |
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; }, |