Author: violetagg Date: Sat Aug 27 09:01:45 2016 New Revision: 1757976 URL: http://svn.apache.org/viewvc?rev=1757976&view=rev Log: When flushing if possible write the data to the socket directly from the provided buffer instead of copying data first to the socket write buffer and then to the socket.
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java?rev=1757976&r1=1757975&r2=1757976&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Sat Aug 27 09:01:45 2016 @@ -427,19 +427,19 @@ public abstract class SocketWrapperBase< // If it is possible write the data to the socket directly from the // provided buffer otherwise transfer it to the socket write buffer if (socketBufferHandler.isWriteBufferEmpty()) { - writeBlockingInternal(from); + writeByteBufferBlocking(from); } else { socketBufferHandler.configureWriteBufferForWrite(); transfer(from, socketBufferHandler.getWriteBuffer()); if (!socketBufferHandler.isWriteBufferWritable()) { doWrite(true); - writeBlockingInternal(from); + writeByteBufferBlocking(from); } } } - private void writeBlockingInternal(ByteBuffer from) throws IOException { + private void writeByteBufferBlocking(ByteBuffer from) throws IOException { // The socket write buffer capacity is socket.appWriteBufSize int limit = socketBufferHandler.getWriteBuffer().capacity(); int fromLimit = from.limit(); @@ -509,18 +509,7 @@ public abstract class SocketWrapperBase< */ protected void writeNonBlocking(ByteBuffer from) throws IOException { if (bufferedWrites.size() == 0 && socketBufferHandler.isWriteBufferWritable()) { - if (socketBufferHandler.isWriteBufferEmpty()) { - writeNonBlockingInternal(from); - } else { - socketBufferHandler.configureWriteBufferForWrite(); - transfer(from, socketBufferHandler.getWriteBuffer()); - if (!socketBufferHandler.isWriteBufferWritable()) { - doWrite(false); - if (socketBufferHandler.isWriteBufferWritable()) { - writeNonBlockingInternal(from); - } - } - } + writeNonBlockingInternal(from); } if (from.remaining() > 0) { @@ -531,6 +520,24 @@ public abstract class SocketWrapperBase< private boolean writeNonBlockingInternal(ByteBuffer from) throws IOException { + if (socketBufferHandler.isWriteBufferEmpty()) { + return writeByteBufferNonBlocking(from); + } else { + socketBufferHandler.configureWriteBufferForWrite(); + transfer(from, socketBufferHandler.getWriteBuffer()); + if (!socketBufferHandler.isWriteBufferWritable()) { + doWrite(false); + if (socketBufferHandler.isWriteBufferWritable()) { + return writeByteBufferNonBlocking(from); + } + } + } + + return !socketBufferHandler.isWriteBufferWritable(); + } + + + private boolean writeByteBufferNonBlocking(ByteBuffer from) throws IOException { // The socket write buffer capacity is socket.appWriteBufSize int limit = socketBufferHandler.getWriteBuffer().capacity(); int fromLimit = from.limit(); @@ -543,7 +550,7 @@ public abstract class SocketWrapperBase< // Didn't write the whole amount of data in the last // non-blocking write. // Exit the loop. - return false; + return true; } } @@ -552,7 +559,7 @@ public abstract class SocketWrapperBase< transfer(from, socketBufferHandler.getWriteBuffer()); } - return socketBufferHandler.isWriteBufferWritable(); + return false; } @@ -586,19 +593,18 @@ public abstract class SocketWrapperBase< if (bufferedWrites.size() > 0) { Iterator<ByteBufferHolder> bufIter = bufferedWrites.iterator(); - while (socketBufferHandler.isWriteBufferEmpty() && bufIter.hasNext()) { + while (bufIter.hasNext()) { ByteBufferHolder buffer = bufIter.next(); buffer.flip(); - while (socketBufferHandler.isWriteBufferEmpty() - && buffer.getBuf().remaining() > 0) { - socketBufferHandler.configureWriteBufferForWrite(); - transfer(buffer.getBuf(), socketBufferHandler.getWriteBuffer()); - if (buffer.getBuf().remaining() == 0) { - bufIter.remove(); - } - doWrite(true); + writeBlocking(buffer.getBuf()); + if (buffer.getBuf().remaining() == 0) { + bufIter.remove(); } } + + if (!socketBufferHandler.isWriteBufferEmpty()) { + doWrite(true); + } } } @@ -610,28 +616,27 @@ public abstract class SocketWrapperBase< // Write to the socket, if there is anything to write if (dataLeft) { doWrite(false); + dataLeft = !socketBufferHandler.isWriteBufferEmpty(); } - dataLeft = !socketBufferHandler.isWriteBufferEmpty(); - if (!dataLeft && bufferedWrites.size() > 0) { Iterator<ByteBufferHolder> bufIter = bufferedWrites.iterator(); - while (socketBufferHandler.isWriteBufferEmpty() && bufIter.hasNext()) { + while (!dataLeft && bufIter.hasNext()) { ByteBufferHolder buffer = bufIter.next(); buffer.flip(); - while (socketBufferHandler.isWriteBufferEmpty() - && buffer.getBuf().remaining() > 0) { - socketBufferHandler.configureWriteBufferForWrite(); - transfer(buffer.getBuf(), socketBufferHandler.getWriteBuffer()); - if (buffer.getBuf().remaining() == 0) { - bufIter.remove(); - } - doWrite(false); + dataLeft = writeNonBlockingInternal(buffer.getBuf()); + if (buffer.getBuf().remaining() == 0) { + bufIter.remove(); } } + + if (!dataLeft && !socketBufferHandler.isWriteBufferEmpty()) { + doWrite(false); + dataLeft = !socketBufferHandler.isWriteBufferEmpty(); + } } - return !socketBufferHandler.isWriteBufferEmpty(); + return dataLeft; } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org