Author: remy.maucherat(a)jboss.com
Date: 2014-06-06 11:54:38 -0400 (Fri, 06 Jun 2014)
New Revision: 2453
Modified:
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/FutureToSendHandler.java
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsSession.java
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java
Log:
Related to BZ1100491: Switch to the Tomcat websockets code for IO. With an added sync for
text buffers.
Modified:
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/FutureToSendHandler.java
===================================================================
---
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/FutureToSendHandler.java 2014-06-06
15:52:54 UTC (rev 2452)
+++
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/FutureToSendHandler.java 2014-06-06
15:54:38 UTC (rev 2453)
@@ -25,8 +25,6 @@
import javax.websocket.SendHandler;
import javax.websocket.SendResult;
-import org.apache.coyote.http11.Http11AbstractProcessor;
-
/**
* Converts a Future to a SendHandler.
*/
@@ -75,11 +73,6 @@
ExecutionException {
try {
wsSession.registerFuture(this);
- // If inside a container thread, must use an autoblocking flush as the write
- // event will never come to the Servlet layer until the container thread
returns
- if (latch.getCount() > 0 &&
Http11AbstractProcessor.containerThread.get() == Boolean.TRUE) {
- wsSession.writeBlock();
- }
latch.await();
} finally {
wsSession.unregisterFuture(this);
@@ -97,19 +90,10 @@
boolean retval = false;
try {
wsSession.registerFuture(this);
- // If inside a container thread, must use an autoblocking flush as the write
- // event will never come to the Servlet layer until the container thread
returns
- if (latch.getCount() > 0 &&
Http11AbstractProcessor.containerThread.get() == Boolean.TRUE) {
- long nanoTime = System.nanoTime();
- wsSession.writeBlock();
- // Removing the time spent on IO from the specified timeout
- // Note: it may wait more than what the user has specified
- timeout = TimeUnit.NANOSECONDS.convert(timeout, unit) -
(System.nanoTime() - nanoTime);
- unit = TimeUnit.NANOSECONDS;
- }
retval = latch.await(timeout, unit);
} finally {
wsSession.unregisterFuture(this);
+
}
if (retval == false) {
throw new TimeoutException();
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-06
15:52:54 UTC (rev 2452)
+++
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java 2014-06-06
15:54:38 UTC (rev 2453)
@@ -591,11 +591,9 @@
protected abstract void doWrite(SendHandler handler, ByteBuffer... data);
- protected abstract void writeBlock();
protected abstract boolean isMasked();
protected abstract void doClose();
-
private static void writeHeader(ByteBuffer headerBuffer, byte opCode,
ByteBuffer payload, boolean first, boolean last, boolean masked,
byte[] mask) {
@@ -671,7 +669,7 @@
}
public void write() {
- synchronized (endpoint) {
+ synchronized (buffer) {
buffer.clear();
CoderResult cr = encoder.encode(message, buffer, true);
if (cr.isError()) {
Modified:
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java
===================================================================
---
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java 2014-06-06
15:52:54 UTC (rev 2452)
+++
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsRemoteEndpointImplClient.java 2014-06-06
15:54:38 UTC (rev 2453)
@@ -37,11 +37,6 @@
@Override
- protected void writeBlock() {
- }
-
-
- @Override
protected void doWrite(SendHandler handler, ByteBuffer... data) {
long timeout = getSendTimeout();
if (timeout < 1) {
Modified: branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsSession.java
===================================================================
--- branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsSession.java 2014-06-06
15:52:54 UTC (rev 2452)
+++ branches/7.4.x/src/main/java/org/apache/tomcat/websocket/WsSession.java 2014-06-06
15:54:38 UTC (rev 2453)
@@ -449,13 +449,6 @@
}
}
- /**
- * Force an autoblocking flush.
- */
- public void writeBlock() {
- wsRemoteEndpoint.writeBlock();
- }
-
private void fireEndpointOnClose(CloseReason closeReason) {
// Fire the onClose event
Modified:
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
===================================================================
---
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java 2014-06-06
15:52:54 UTC (rev 2452)
+++
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java 2014-06-06
15:54:38 UTC (rev 2453)
@@ -44,6 +44,8 @@
*/
public class WsHttpUpgradeHandler implements HttpUpgradeHandler {
+ private final ClassLoader applicationClassLoader;
+
private Endpoint ep;
private EndpointConfig endpointConfig;
private WsServerContainer webSocketContainer;
@@ -57,6 +59,7 @@
public WsHttpUpgradeHandler() {
+ applicationClassLoader = Thread.currentThread().getContextClassLoader();
}
@@ -212,7 +215,7 @@
public void onWritePossible() {
// Triggered by the poller so this isn't the same thread that
// triggered the write so no need for a dispatch
- wsRemoteEndpointServer.onWritePossible(false, false);
+ wsRemoteEndpointServer.onWritePossible(false);
}
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-06
15:52:54 UTC (rev 2452)
+++
branches/7.4.x/src/main/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java 2014-06-06
15:54:38 UTC (rev 2453)
@@ -71,17 +71,11 @@
this.buffers = buffers;
// This is definitely the same thread that triggered the write so a
// dispatch will be required.
- onWritePossible(true, false);
+ onWritePossible(true);
}
- @Override
- protected void writeBlock() {
- onWritePossible(false, true);
- }
-
-
- public synchronized void onWritePossible(boolean useDispatch, boolean block) {
+ public void onWritePossible(boolean useDispatch) {
if (buffers == null) {
// Servlet 3.1 will call the write listener once even if nothing
// was written
@@ -90,19 +84,20 @@
boolean complete = true;
try {
// If this is false there will be a call back when it is true
- while (block || sos.isReady()) {
+ while (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;
+ synchronized (buffer) {
+ if (buffer.hasRemaining()) {
+ complete = false;
+ sos.write(buffer.array(), buffer.arrayOffset(),
+ buffer.limit());
+ buffer.position(buffer.limit());
+ break;
+ }
}
}
if (complete) {
- timeoutExpiry = -1;
wsWriteTimeout.unregister(this);
clearHandler(null, useDispatch);
// Explicit flush for compatibility with buffered streams