Author: remy.maucherat(a)jboss.com
Date: 2014-06-03 07:36:03 -0400 (Tue, 03 Jun 2014)
New Revision: 2439
Modified:
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
Log:
BZ1100491: Add a little extra sync to avoid corruption, possibly caused by extra
onWritePossible notifications.
Modified:
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
===================================================================
---
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 2014-06-02
20:45:12 UTC (rev 2438)
+++
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 2014-06-03
11:36:03 UTC (rev 2439)
@@ -671,15 +671,18 @@
}
public void write() {
- buffer.clear();
- CoderResult cr = encoder.encode(message, buffer, true);
- if (cr.isError()) {
- throw new IllegalArgumentException(cr.toString());
+ // FIXME: this sync should be useless
+ synchronized (buffer) {
+ buffer.clear();
+ CoderResult cr = encoder.encode(message, buffer, true);
+ if (cr.isError()) {
+ throw new IllegalArgumentException(cr.toString());
+ }
+ isDone = !cr.isOverflow();
+ buffer.flip();
+ endpoint.startMessage(Constants.OPCODE_TEXT, buffer,
+ isDone && isLast, this);
}
- isDone = !cr.isOverflow();
- buffer.flip();
- endpoint.startMessage(Constants.OPCODE_TEXT, buffer,
- isDone && isLast, this);
}
@Override
Modified:
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
===================================================================
---
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java 2014-06-02
20:45:12 UTC (rev 2438)
+++
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java 2014-06-03
11:36:03 UTC (rev 2439)
@@ -93,12 +93,16 @@
while (block || sos.isReady()) {
complete = true;
for (ByteBuffer buffer : buffers) {
- if (buffer.hasRemaining()) {
- complete = false;
- sos.write(buffer.array(), buffer.arrayOffset(),
- buffer.limit());
- buffer.position(buffer.limit());
- break;
+ // FIXME: this sync should be useless, an unwanted onWritePossible
+ // seems to be causing this
+ synchronized (buffer) {
+ if (buffer.hasRemaining()) {
+ complete = false;
+ sos.write(buffer.array(), buffer.arrayOffset(),
+ buffer.limit());
+ buffer.position(buffer.limit());
+ break;
+ }
}
}
if (complete) {