Author: markt
Date: Sun Feb 22 18:49:27 2015
New Revision: 1661515
URL: http://svn.apache.org/r1661515
Log:
The container is responsible for the first calls to onDataAvailable()
and onWritePossible(). Trigger them from the setting of the appropriate
listener.
Modified:
tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java
tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java
Modified:
tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java?rev=1661515&r1=1661514&r2=1661515&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java
(original)
+++
tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletInputStream.java
Sun Feb 22 18:49:27 2015
@@ -21,9 +21,11 @@ import java.io.IOException;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
+import org.apache.coyote.ContainerThreadMarker;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.net.DispatchType;
import org.apache.tomcat.util.net.SocketWrapperBase;
import org.apache.tomcat.util.res.StringManager;
@@ -98,6 +100,13 @@ public class UpgradeServletInputStream e
throw new
IllegalStateException(sm.getString("upgrade.sis.read.closed"));
}
+ // Container is responsible for first call to onDataAvailable().
+ if (ContainerThreadMarker.isContainerThread()) {
+ socketWrapper.addDispatch(DispatchType.NON_BLOCKING_READ);
+ } else {
+ socketWrapper.registerReadInterest();
+ }
+
this.listener = listener;
this.applicationLoader =
Thread.currentThread().getContextClassLoader();
// Switching to non-blocking. Don't know if data is available.
Modified:
tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java?rev=1661515&r1=1661514&r2=1661515&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java
(original)
+++
tomcat/trunk/java/org/apache/coyote/http11/upgrade/UpgradeServletOutputStream.java
Sun Feb 22 18:49:27 2015
@@ -21,11 +21,9 @@ import java.io.IOException;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
-import org.apache.coyote.ContainerThreadMarker;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.ExceptionUtils;
-import org.apache.tomcat.util.net.DispatchType;
import org.apache.tomcat.util.net.SocketWrapperBase;
import org.apache.tomcat.util.res.StringManager;
@@ -110,15 +108,18 @@ public class UpgradeServletOutputStream
if (closed) {
throw new
IllegalStateException(sm.getString("upgrade.sos.write.closed"));
}
- // Container is responsible for first call to onWritePossible() but
only
- // need to do this if setting the listener for the first time.
+ // Container is responsible for first call to onWritePossible().
synchronized (registeredLock) {
registered = true;
- if (ContainerThreadMarker.isContainerThread()) {
- socketWrapper.addDispatch(DispatchType.NON_BLOCKING_WRITE);
- } else {
- socketWrapper.registerWriteInterest();
- }
+ // Need to get writes onto a separate thread as long as WebSocket
+ // uses Servlet non-blocking I/O as onOpen can throw an error which
+ // closes the WebSocket connection. That uses a blocking write
which
+ // means onwWritePossible needs to be on a separate thread to clear
+ // the latch used in the blocking write. If
+ // socketWrapper.addDispatch() was used the current thread would
+ // block on the write and would not process the dispatch until the
+ // latch timed out triggering more errors.
+ socketWrapper.registerWriteInterest();
}
this.listener = listener;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]