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: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to