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