Author: markt Date: Wed Sep 4 12:33:42 2013 New Revision: 1519994 URL: http://svn.apache.org/r1519994 Log: Add some plumbing for non-blocking writes to the AJP connectors. There is no functional change. All writes remain blocking.
Modified: tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Modified: tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1519994&r1=1519993&r2=1519994&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java Wed Sep 4 12:33:42 2013 @@ -672,7 +672,7 @@ public abstract class AbstractAjpProcess } cping = true; try { - output(pongMessageArray, 0, pongMessageArray.length); + output(pongMessageArray, 0, pongMessageArray.length, true); } catch (IOException e) { error = true; } @@ -855,8 +855,8 @@ public abstract class AbstractAjpProcess protected abstract void resetTimeouts(); // Methods called by prepareResponse() - protected abstract void output(byte[] src, int offset, int length) - throws IOException; + protected abstract int output(byte[] src, int offset, int length, + boolean block) throws IOException; // Methods called by process() protected abstract void setupSocket(SocketWrapper<S> socketWrapper) @@ -1002,7 +1002,7 @@ public abstract class AbstractAjpProcess // Request more data immediately if (!first && !waitingForBodyMessage) { - output(getBodyMessageArray, 0, getBodyMessageArray.length); + output(getBodyMessageArray, 0, getBodyMessageArray.length, true); waitingForBodyMessage = true; } @@ -1397,8 +1397,7 @@ public abstract class AbstractAjpProcess // Write to buffer responseMessage.end(); - output(responseMessage.getBuffer(), 0, - responseMessage.getLen()); + output(responseMessage.getBuffer(), 0, responseMessage.getLen(), true); } @@ -1408,7 +1407,7 @@ public abstract class AbstractAjpProcess protected void flush(boolean explicit) throws IOException { if (explicit && !finished) { // Send the flush message - output(flushMessageArray, 0, flushMessageArray.length); + output(flushMessageArray, 0, flushMessageArray.length, true); } } @@ -1440,9 +1439,9 @@ public abstract class AbstractAjpProcess // Add the end message if (error) { - output(endAndCloseMessageArray, 0, endAndCloseMessageArray.length); + output(endAndCloseMessageArray, 0, endAndCloseMessageArray.length, true); } else { - output(endMessageArray, 0, endMessageArray.length); + output(endMessageArray, 0, endMessageArray.length, true); } } @@ -1523,7 +1522,7 @@ public abstract class AbstractAjpProcess responseMessage.appendByte(Constants.JK_AJP13_SEND_BODY_CHUNK); responseMessage.appendBytes(chunk.getBytes(), chunk.getOffset() + off, thisTime); responseMessage.end(); - output(responseMessage.getBuffer(), 0, responseMessage.getLen()); + output(responseMessage.getBuffer(), 0, responseMessage.getLen(), true); off += thisTime; } Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java?rev=1519994&r1=1519993&r2=1519994&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpAprProcessor.java Wed Sep 4 12:33:42 2013 @@ -24,6 +24,7 @@ import java.util.concurrent.locks.Reentr import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.jni.Socket; +import org.apache.tomcat.jni.Status; import org.apache.tomcat.util.net.AprEndpoint; import org.apache.tomcat.util.net.SocketWrapper; @@ -102,22 +103,32 @@ public class AjpAprProcessor extends Abs @Override - protected void output(byte[] src, int offset, int length) + protected int output(byte[] src, int offset, int length, boolean block) throws IOException { + + if (length == 0) { + return 0; + } + outputBuffer.put(src, offset, length); - long socketRef = socketWrapper.getSocket().longValue(); + int result = -1; - if (outputBuffer.position() > 0) { - if ((socketRef != 0) && - writeSocket(0, outputBuffer.position(), true) < 0) { + if (socketWrapper.getSocket().longValue() != 0) { + result = writeSocket(0, outputBuffer.position(), block); + if (Status.APR_STATUS_IS_EAGAIN(-result)) { + result = 0; + } + if (result < 0) { // There are no re-tries so clear the buffer to prevent a // possible overflow if the buffer is used again. BZ53119. outputBuffer.clear(); throw new IOException(sm.getString("ajpprocessor.failedsend")); } - outputBuffer.clear(); } + outputBuffer.clear(); + + return result; } Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java?rev=1519994&r1=1519993&r2=1519994&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpNioProcessor.java Wed Sep 4 12:33:42 2013 @@ -110,7 +110,7 @@ public class AjpNioProcessor extends Abs @Override - protected void output(byte[] src, int offset, int length) + protected int output(byte[] src, int offset, int length, boolean block) throws IOException { NioEndpoint.KeyAttachment att = @@ -132,8 +132,8 @@ public class AjpNioProcessor extends Abs //ignore } try { - pool.write(writeBuffer, socketWrapper.getSocket(), selector, - writeTimeout, true); + return pool.write(writeBuffer, socketWrapper.getSocket(), selector, + writeTimeout, block); } finally { writeBuffer.clear(); if (selector != null) { Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java?rev=1519994&r1=1519993&r2=1519994&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Wed Sep 4 12:33:42 2013 @@ -97,9 +97,10 @@ public class AjpProcessor extends Abstra @Override - protected void output(byte[] src, int offset, int length) + protected int output(byte[] src, int offset, int length, boolean block) throws IOException { output.write(src, offset, length); + return length; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org