summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2014-11-27 18:01:55 +0100
committerBenoit Foucher <benoit@zeroc.com>2014-11-27 18:01:55 +0100
commit3f13e098c6614993e396f0a30192a1733754dfdd (patch)
treeefa9817f0c7a1bd7ddcc5edc7ac2dc2dbfbb8e50 /java/src
parentFixed (ICE-6025) - allDemos.py does not work on Windows (diff)
downloadice-3f13e098c6614993e396f0a30192a1733754dfdd.tar.bz2
ice-3f13e098c6614993e396f0a30192a1733754dfdd.tar.xz
ice-3f13e098c6614993e396f0a30192a1733754dfdd.zip
Fixes for ICE-5984 & ICE-5965: binding test warwnings with WS
Diffstat (limited to 'java/src')
-rw-r--r--java/src/Ice/src/main/java/IceInternal/WSTransceiver.java100
1 files changed, 54 insertions, 46 deletions
diff --git a/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java b/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java
index bc65891c058..facca10cd4b 100644
--- a/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java
+++ b/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java
@@ -345,9 +345,7 @@ final class WSTransceiver implements Transceiver
{
s = _delegate.write(_writeBuffer);
}
-
- if(s == SocketOperation.None && _incoming && !buf.empty() &&
- _writeState == WriteStatePayload)
+ else if(s == SocketOperation.None && _incoming && !buf.empty() && _writeState == WriteStatePayload)
{
s = _delegate.write(buf);
}
@@ -1174,17 +1172,6 @@ final class WSTransceiver implements Transceiver
assert(buf.b.position() == 0);
prepareWriteHeader((byte)OP_DATA, buf.size());
- //
- // For server connections, we use the _writeBuffer only to
- // write the header, the message is sent directly from the
- // message buffer. For client connections, we use the write
- // buffer for both the header and message buffer since we need
- // to mask the message data.
- //
- if(_incoming)
- {
- _writeBuffer.b.flip();
- }
_writeState = WriteStatePayload;
}
else if(_state == StatePingPending)
@@ -1245,48 +1232,69 @@ final class WSTransceiver implements Transceiver
//
// For an outgoing connection, each message must be masked with a random
// 32-bit value, so we copy the entire message into the internal buffer
- // for writing.
+ // for writing. For incoming connections, we just copy the start of the
+ // message in the internal buffer after the hedaer. If the message is
+ // larger, the reminder is sent directly from the message buffer to avoid
+ // copying.
//
- // For an incoming connection, we use the internal buffer to hold the
- // frame header, and then write the caller's buffer to avoid copying.
- //
- if(!_incoming)
+
+ if(!_incoming && (_writePayloadLength == 0 || !_writeBuffer.b.hasRemaining()))
{
- if(_writePayloadLength == 0 || !_writeBuffer.b.hasRemaining())
+ if(!_writeBuffer.b.hasRemaining())
{
- if(!_writeBuffer.b.hasRemaining())
+ _writeBuffer.b.position(0);
+ }
+
+ int n = buf.b.position();
+ final int sz = buf.size();
+ if(buf.b.hasArray() && _writeBuffer.b.hasArray())
+ {
+ int pos = _writeBuffer.b.position();
+ final int count = Math.min(sz - n, _writeBuffer.b.remaining());
+ final byte[] src = buf.b.array();
+ final int srcOff = buf.b.arrayOffset();
+ final byte[] dest = _writeBuffer.b.array();
+ final int destOff = _writeBuffer.b.arrayOffset();
+ for(int i = 0; i < count; ++i, ++n, ++pos)
{
- _writeBuffer.b.position(0);
+ dest[destOff + pos] = (byte)(src[srcOff + n] ^ _writeMask[n % 4]);
}
-
- int n = buf.b.position();
- final int sz = buf.size();
- if(buf.b.hasArray() && _writeBuffer.b.hasArray())
+ _writeBuffer.b.position(pos);
+ }
+ else
+ {
+ for(; n < sz && _writeBuffer.b.hasRemaining(); ++n)
{
- int pos = _writeBuffer.b.position();
- final int count = Math.min(sz - n, _writeBuffer.b.remaining());
- final byte[] src = buf.b.array();
- final int srcOff = buf.b.arrayOffset();
- final byte[] dest = _writeBuffer.b.array();
- final int destOff = _writeBuffer.b.arrayOffset();
- for(int i = 0; i < count; ++i, ++n, ++pos)
- {
- dest[destOff + pos] = (byte)(src[srcOff + n] ^ _writeMask[n % 4]);
- }
- _writeBuffer.b.position(pos);
+ final byte b = (byte)(buf.b.get(n) ^ _writeMask[n % 4]);
+ _writeBuffer.b.put(b);
+ }
+ }
+ _writePayloadLength = n;
+ _writeBuffer.b.flip();
+ }
+ else if(_writePayloadLength == 0)
+ {
+ assert(_incoming);
+ if(_writeBuffer.b.hasRemaining())
+ {
+ assert(buf.b.position() == 0);
+ int n = _writeBuffer.b.remaining();
+ if(buf.b.remaining() > n)
+ {
+ int limit = buf.b.limit();
+ buf.b.limit(n);
+ _writeBuffer.b.put(buf.b);
+ buf.b.limit(limit);
+ _writePayloadLength = n;
}
else
{
- for(; n < sz && _writeBuffer.b.hasRemaining(); ++n)
- {
- final byte b = (byte)(buf.b.get(n) ^ _writeMask[n % 4]);
- _writeBuffer.b.put(b);
- }
+ _writePayloadLength = buf.b.remaining();
+ _writeBuffer.b.put(buf.b);
}
- _writePayloadLength = n;
-
- _writeBuffer.b.flip();
+ buf.b.position(0);
}
+ _writeBuffer.b.flip();
}
return true;
}
@@ -1358,7 +1366,7 @@ final class WSTransceiver implements Transceiver
}
}
- if(!_incoming && _writePayloadLength > 0)
+ if((!_incoming || buf.b.position() == 0) && _writePayloadLength > 0)
{
if(!_writeBuffer.b.hasRemaining())
{