Author: markt Date: Mon Sep 5 15:03:51 2011 New Revision: 1165309 URL: http://svn.apache.org/viewvc?rev=1165309&view=rev Log: Pull out implementation specific processing that determines if keep-alive should be broken into a separate method.
Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1165309&r1=1165308&r2=1165309&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Mon Sep 5 15:03:51 2011 @@ -47,6 +47,7 @@ import org.apache.tomcat.util.http.MimeH import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SocketStatus; +import org.apache.tomcat.util.net.SocketWrapper; import org.apache.tomcat.util.res.StringManager; public abstract class AbstractHttp11Processor<S> extends AbstractProcessor<S> { @@ -84,6 +85,14 @@ public abstract class AbstractHttp11Proc */ protected boolean openSocket = false; + + /** + * Flag that indicates that send file processing is in progress and that the + * socket should not be returned to the poller (where a poller is used). + */ + protected boolean sendfileInProgress = false; + + /** * HTTP/1.1 flag. */ @@ -1303,7 +1312,18 @@ public abstract class AbstractHttp11Proc } } - + + + /** + * Checks to see of the keep-alive loop should be broken, performing any + * processing (e.g. send file handling) that may have an impact on whether + * or not the keep-alive loop should be broken. + * @return + */ + protected abstract boolean breakKeepAliveLoop( + SocketWrapper<S> socketWrapper); + + public final void recycle() { getInputBuffer().recycle(); getOutputBuffer().recycle(); Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java?rev=1165309&r1=1165308&r2=1165309&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java Mon Sep 5 15:03:51 2011 @@ -182,6 +182,7 @@ public class Http11AprProcessor extends keepAlive = true; comet = false; openSocket = false; + sendfileInProgress = false; int soTimeout = endpoint.getSoTimeout(); @@ -190,7 +191,6 @@ public class Http11AprProcessor extends } boolean keptAlive = false; - boolean sendfileInProgress = false; long socketRef = socketWrapper.getSocket().longValue(); @@ -319,27 +319,8 @@ public class Http11AprProcessor extends rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE); - // Do sendfile as needed: add socket to sendfile and end - if (sendfileData != null && !error) { - sendfileData.socket = socketRef; - sendfileData.keepAlive = keepAlive; - if (!((AprEndpoint)endpoint).getSendfile().add(sendfileData)) { - // Didn't send all of the data to sendfile. - if (sendfileData.socket == 0) { - // The socket is no longer set. Something went wrong. - // Close the connection. Too late to set status code. - if (log.isDebugEnabled()) { - log.debug(sm.getString( - "http11processor.sendfile.error")); - } - error = true; - } else { - // The sendfile Poller will add the socket to the main - // Poller once sendfile processing is complete - sendfileInProgress = true; - } - break; - } + if (breakKeepAliveLoop(socketWrapper)) { + break; } } @@ -361,6 +342,34 @@ public class Http11AprProcessor extends @Override + protected boolean breakKeepAliveLoop(SocketWrapper<Long> socketWrapper) { + // Do sendfile as needed: add socket to sendfile and end + if (sendfileData != null && !error) { + sendfileData.socket = socketWrapper.getSocket().longValue(); + sendfileData.keepAlive = keepAlive; + if (!((AprEndpoint)endpoint).getSendfile().add(sendfileData)) { + // Didn't send all of the data to sendfile. + if (sendfileData.socket == 0) { + // The socket is no longer set. Something went wrong. + // Close the connection. Too late to set status code. + if (log.isDebugEnabled()) { + log.debug(sm.getString( + "http11processor.sendfile.error")); + } + error = true; + } else { + // The sendfile Poller will add the socket to the main + // Poller once sendfile processing is complete + sendfileInProgress = true; + } + return true; + } + } + return false; + } + + + @Override protected boolean disableKeepAlive() { return false; } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=1165309&r1=1165308&r2=1165309&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Mon Sep 5 15:03:51 2011 @@ -211,6 +211,7 @@ public class Http11NioProcessor extends keepAlive = true; comet = false; openSocket = false; + sendfileInProgress = false; int soTimeout = endpoint.getSoTimeout(); @@ -380,16 +381,8 @@ public class Http11NioProcessor extends rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE); - // Do sendfile as needed: add socket to sendfile and end - if (sendfileData != null && !error) { - ((KeyAttachment) socketWrapper).setSendfileData(sendfileData); - sendfileData.keepAlive = keepAlive; - SelectionKey key = socketWrapper.getSocket().getIOChannel().keyFor( - socketWrapper.getSocket().getPoller().getSelector()); - //do the first write on this thread, might as well - openSocket = socketWrapper.getSocket().getPoller().processSendfile(key, - (KeyAttachment) socketWrapper, true, true); - break; + if (breakKeepAliveLoop(socketWrapper)) { + break; } } @@ -401,7 +394,24 @@ public class Http11NioProcessor extends } else { return (openSocket) ? (readComplete?SocketState.OPEN:SocketState.LONG) : SocketState.CLOSED; } + } + + @Override + protected boolean breakKeepAliveLoop( + SocketWrapper<NioChannel> socketWrapper) { + // Do sendfile as needed: add socket to sendfile and end + if (sendfileData != null && !error) { + ((KeyAttachment) socketWrapper).setSendfileData(sendfileData); + sendfileData.keepAlive = keepAlive; + SelectionKey key = socketWrapper.getSocket().getIOChannel().keyFor( + socketWrapper.getSocket().getPoller().getSelector()); + //do the first write on this thread, might as well + openSocket = socketWrapper.getSocket().getPoller().processSendfile(key, + (KeyAttachment) socketWrapper, true, true); + return true; + } + return false; } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1165309&r1=1165308&r2=1165309&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Mon Sep 5 15:03:51 2011 @@ -146,6 +146,7 @@ public class Http11Processor extends Abs keepAlive = true; comet = false; openSocket = false; + sendfileInProgress = false; int soTimeout = endpoint.getSoTimeout(); @@ -313,10 +314,8 @@ public class Http11Processor extends Abs rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE); - // If we don't have a pipe-lined request allow this thread to be - // used by another connection - if (isAsync() || error || inputBuffer.lastValid == 0) { - break; + if (breakKeepAliveLoop(socketWrapper)) { + break; } } @@ -333,7 +332,18 @@ public class Http11Processor extends Abs } } } - + + + @Override + protected boolean breakKeepAliveLoop(SocketWrapper<Socket> socketWrapper) { + // If we don't have a pipe-lined request allow this thread to be + // used by another connection + if (isAsync() || error || inputBuffer.lastValid == 0) { + return true; + } + return false; + } + @Override protected boolean disableKeepAlive() { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org