Author: markt Date: Thu Jan 8 13:09:31 2015 New Revision: 1650265 URL: http://svn.apache.org/r1650265 Log: Add SocketWrapper to AbstractOutputBuffer. While this allows a little code reduction now, the primary reason for this is a step towards the goal of having a single OutputBuffer implementation with the APR/NIO/NIO2 code moving to the SocketWrapper or Endpoint as appropriate.
Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.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=1650265&r1=1650264&r2=1650265&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Thu Jan 8 13:09:31 2015 @@ -939,7 +939,7 @@ public abstract class AbstractHttp11Proc // Setting up the I/O setSocketWrapper(socketWrapper); getInputBuffer().init(socketWrapper, endpoint); - getOutputBuffer().init(socketWrapper, endpoint); + getOutputBuffer().init(socketWrapper); // Flags keepAlive = true; Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/AbstractOutputBuffer.java Thu Jan 8 13:09:31 2015 @@ -33,7 +33,6 @@ import org.apache.juli.logging.LogFactor import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.MessageBytes; import org.apache.tomcat.util.http.HttpMessages; -import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.SocketWrapperBase; import org.apache.tomcat.util.res.StringManager; @@ -96,6 +95,12 @@ public abstract class AbstractOutputBuff protected OutputBuffer outputStreamOutputBuffer; /** + * Wrapper for socket where data will be written to. + */ + protected SocketWrapperBase<S> socketWrapper; + + + /** * Bytes written to client for the current request */ protected long byteCount = 0; @@ -316,6 +321,7 @@ public abstract class AbstractOutputBuff public void recycle() { // Sub-classes may wish to do more than this. nextRequest(); + socketWrapper = null; bufferedWrites.clear(); writeBufferFlipped = false; } @@ -368,8 +374,10 @@ public abstract class AbstractOutputBuff } - public abstract void init(SocketWrapperBase<S> socketWrapper, - AbstractEndpoint<S> endpoint) throws IOException; + public void init(SocketWrapperBase<S> socketWrapper) { + this.socketWrapper = socketWrapper; + } + public abstract void sendAck() throws IOException; Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/InternalAprOutputBuffer.java Thu Jan 8 13:09:31 2015 @@ -64,21 +64,16 @@ public class InternalAprOutputBuffer ext private long socket; - private SocketWrapperBase<Long> wrapper; - - private AbstractEndpoint<Long> endpoint; // --------------------------------------------------------- Public Methods @Override - public void init(SocketWrapperBase<Long> socketWrapper, - AbstractEndpoint<Long> endpoint) throws IOException { - - wrapper = socketWrapper; + public void init(SocketWrapperBase<Long> socketWrapper) { + super.init(socketWrapper); socket = socketWrapper.getSocket().longValue(); - this.endpoint = endpoint; + this.endpoint = socketWrapper.getEndpoint(); Socket.setsbb(this.socket, socketWriteBuffer); } @@ -93,7 +88,6 @@ public class InternalAprOutputBuffer ext super.recycle(); socketWriteBuffer.clear(); socket = 0; - wrapper = null; } @@ -191,12 +185,12 @@ public class InternalAprOutputBuffer ext private synchronized void writeToSocket(boolean block) throws IOException { - Lock readLock = wrapper.getBlockingStatusReadLock(); - WriteLock writeLock = wrapper.getBlockingStatusWriteLock(); + Lock readLock = socketWrapper.getBlockingStatusReadLock(); + WriteLock writeLock = socketWrapper.getBlockingStatusWriteLock(); readLock.lock(); try { - if (wrapper.getBlockingStatus() == block) { + if (socketWrapper.getBlockingStatus() == block) { writeToSocket(); return; } @@ -207,7 +201,7 @@ public class InternalAprOutputBuffer ext writeLock.lock(); try { // Set the current settings for this socket - wrapper.setBlockingStatus(block); + socketWrapper.setBlockingStatus(block); if (block) { Socket.timeoutSet(socket, endpoint.getSoTimeout() * 1000); } else { Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/InternalNio2OutputBuffer.java Thu Jan 8 13:09:31 2015 @@ -54,11 +54,6 @@ public class InternalNio2OutputBuffer ex private static final ByteBuffer[] EMPTY_BUF_ARRAY = new ByteBuffer[0]; /** - * Underlying socket. - */ - private SocketWrapperBase<Nio2Channel> socket; - - /** * Track write interest */ protected volatile boolean interest = false; @@ -96,11 +91,10 @@ public class InternalNio2OutputBuffer ex // --------------------------------------------------------- Public Methods @Override - public void init(SocketWrapperBase<Nio2Channel> socketWrapper, - AbstractEndpoint<Nio2Channel> associatedEndpoint) throws IOException { - this.socket = socketWrapper; - this.endpoint = associatedEndpoint; - this.socketWriteBuffer = socket.getSocket().getBufHandler().getWriteBuffer(); + public void init(SocketWrapperBase<Nio2Channel> socketWrapper) { + super.init(socketWrapper); + this.endpoint = socketWrapper.getEndpoint(); + this.socketWriteBuffer = socketWrapper.getSocket().getBufHandler().getWriteBuffer(); this.completionHandler = new CompletionHandler<Integer, ByteBuffer>() { @Override @@ -121,12 +115,12 @@ public class InternalNio2OutputBuffer ex } bufferedWrites.clear(); ByteBuffer[] array = arrayList.toArray(EMPTY_BUF_ARRAY); - socket.getSocket().write(array, 0, array.length, - socket.getTimeout(), TimeUnit.MILLISECONDS, + socketWrapper.getSocket().write(array, 0, array.length, + socketWrapper.getTimeout(), TimeUnit.MILLISECONDS, array, gatherCompletionHandler); } else if (attachment.hasRemaining()) { // Regular write - socket.getSocket().write(attachment, socket.getTimeout(), + socketWrapper.getSocket().write(attachment, socketWrapper.getTimeout(), TimeUnit.MILLISECONDS, attachment, completionHandler); } else { // All data has been written @@ -138,13 +132,13 @@ public class InternalNio2OutputBuffer ex } } if (notify) { - endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, false); + endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, false); } } @Override public void failed(Throwable exc, ByteBuffer attachment) { - socket.setError(true); + socketWrapper.setError(true); if (exc instanceof IOException) { e = (IOException) exc; } else { @@ -152,7 +146,7 @@ public class InternalNio2OutputBuffer ex } response.getRequest().setAttribute(RequestDispatcher.ERROR_EXCEPTION, e); writePending.release(); - endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, true); + endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, true); } }; this.gatherCompletionHandler = new CompletionHandler<Long, ByteBuffer[]>() { @@ -176,8 +170,8 @@ public class InternalNio2OutputBuffer ex } bufferedWrites.clear(); ByteBuffer[] array = arrayList.toArray(EMPTY_BUF_ARRAY); - socket.getSocket().write(array, 0, array.length, - socket.getTimeout(), TimeUnit.MILLISECONDS, + socketWrapper.getSocket().write(array, 0, array.length, + socketWrapper.getTimeout(), TimeUnit.MILLISECONDS, array, gatherCompletionHandler); } else { // All data has been written @@ -189,13 +183,13 @@ public class InternalNio2OutputBuffer ex } } if (notify) { - endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, false); + endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, false); } } @Override public void failed(Throwable exc, ByteBuffer[] attachment) { - socket.setError(true); + socketWrapper.setError(true); if (exc instanceof IOException) { e = (IOException) exc; } else { @@ -203,7 +197,7 @@ public class InternalNio2OutputBuffer ex } response.getRequest().setAttribute(RequestDispatcher.ERROR_EXCEPTION, e); writePending.release(); - endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, true); + endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, true); } }; } @@ -216,7 +210,6 @@ public class InternalNio2OutputBuffer ex @Override public void recycle() { super.recycle(); - socket = null; e = null; interest = false; if (writePending.availablePermits() != 1) { @@ -264,7 +257,7 @@ public class InternalNio2OutputBuffer ex if (length == 0) return; - if (socket == null || socket.getSocket() == null) + if (socketWrapper == null || socketWrapper.getSocket() == null) return; if (isBlocking()) { @@ -284,7 +277,7 @@ public class InternalNio2OutputBuffer ex // Also allows doing autoblocking // Could be "smart" with coordination with the main CoyoteOutputStream to // indicate the end of a write - // Uses: if (writePending.tryAcquire(socket.getTimeout(), TimeUnit.MILLISECONDS)) + // Uses: if (writePending.tryAcquire(socketWrapper.getTimeout(), TimeUnit.MILLISECONDS)) if (writePending.tryAcquire()) { synchronized (completionHandler) { // No pending completion handler, so writing to the main buffer @@ -326,7 +319,7 @@ public class InternalNio2OutputBuffer ex } private boolean flushBufferInternal(boolean block, boolean hasPermit) throws IOException { - if (socket == null || socket.getSocket() == null) + if (socketWrapper == null || socketWrapper.getSocket() == null) return false; if (block) { @@ -334,7 +327,7 @@ public class InternalNio2OutputBuffer ex // The final flush is blocking, but the processing was using // non blocking so wait until an async write is done try { - if (writePending.tryAcquire(socket.getTimeout(), TimeUnit.MILLISECONDS)) { + if (writePending.tryAcquire(socketWrapper.getTimeout(), TimeUnit.MILLISECONDS)) { writePending.release(); } } catch (InterruptedException e) { @@ -346,7 +339,7 @@ public class InternalNio2OutputBuffer ex for (ByteBuffer buffer : bufferedWrites) { buffer.flip(); while (buffer.hasRemaining()) { - if (socket.getSocket().write(buffer).get(socket.getTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) { + if (socketWrapper.getSocket().write(buffer).get(socketWrapper.getTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) { throw new EOFException(sm.getString("iob.failedwrite")); } } @@ -358,7 +351,7 @@ public class InternalNio2OutputBuffer ex writeBufferFlipped = true; } while (socketWriteBuffer.hasRemaining()) { - if (socket.getSocket().write(socketWriteBuffer).get(socket.getTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) { + if (socketWrapper.getSocket().write(socketWriteBuffer).get(socketWrapper.getTimeout(), TimeUnit.MILLISECONDS).intValue() < 0) { throw new EOFException(sm.getString("iob.failedwrite")); } } @@ -396,11 +389,11 @@ public class InternalNio2OutputBuffer ex } bufferedWrites.clear(); ByteBuffer[] array = arrayList.toArray(EMPTY_BUF_ARRAY); - socket.getSocket().write(array, 0, array.length, socket.getTimeout(), + socketWrapper.getSocket().write(array, 0, array.length, socketWrapper.getTimeout(), TimeUnit.MILLISECONDS, array, gatherCompletionHandler); } else if (socketWriteBuffer.hasRemaining()) { // Regular write - socket.getSocket().write(socketWriteBuffer, socket.getTimeout(), + socketWrapper.getSocket().write(socketWriteBuffer, socketWrapper.getTimeout(), TimeUnit.MILLISECONDS, socketWriteBuffer, completionHandler); } else { // Nothing was written @@ -439,7 +432,7 @@ public class InternalNio2OutputBuffer ex interest = true; } else { // If no write is pending, notify - endpoint.processSocket(socket, SocketStatus.OPEN_WRITE, true); + endpoint.processSocket(socketWrapper, SocketStatus.OPEN_WRITE, true); } } } Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/InternalNioOutputBuffer.java Thu Jan 8 13:09:31 2015 @@ -25,7 +25,6 @@ import java.util.Iterator; import org.apache.coyote.ByteBufferHolder; import org.apache.coyote.Response; -import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.NioChannel; import org.apache.tomcat.util.net.NioEndpoint; import org.apache.tomcat.util.net.NioSelectorPool; @@ -62,11 +61,10 @@ public class InternalNioOutputBuffer ext // --------------------------------------------------------- Public Methods @Override - public void init(SocketWrapperBase<NioChannel> socketWrapper, - AbstractEndpoint<NioChannel> endpoint) throws IOException { - + public void init(SocketWrapperBase<NioChannel> socketWrapper) { + super.init(socketWrapper); socket = socketWrapper.getSocket(); - pool = ((NioEndpoint)endpoint).getSelectorPool(); + pool = ((NioEndpoint)socketWrapper.getEndpoint()).getSelectorPool(); socketWriteBuffer = socket.getBufHandler().getWriteBuffer(); } @@ -170,8 +168,8 @@ public class InternalNioOutputBuffer ext } } - NioEndpoint.NioSocketWrapper ka = (NioEndpoint.NioSocketWrapper)socket.getAttachment(); - if (ka != null) ka.access();//prevent timeouts for just doing client writes + // Prevent timeouts for just doing client writes + socketWrapper.access(); if (!isBlocking() && length > 0) { // Remaining data must be buffered Modified: tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.java?rev=1650265&r1=1650264&r2=1650265&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.java (original) +++ tomcat/trunk/test/org/apache/coyote/http11/filters/TesterOutputBuffer.java Thu Jan 8 13:09:31 2015 @@ -24,7 +24,6 @@ import org.apache.coyote.OutputBuffer; import org.apache.coyote.Response; import org.apache.coyote.http11.AbstractOutputBuffer; import org.apache.tomcat.util.buf.ByteChunk; -import org.apache.tomcat.util.net.AbstractEndpoint; import org.apache.tomcat.util.net.SocketWrapperBase; /** @@ -47,8 +46,7 @@ public class TesterOutputBuffer extends // --------------------------------------------------------- Public Methods @Override - public void init(SocketWrapperBase<Socket> socketWrapper, - AbstractEndpoint<Socket> endpoint) throws IOException { + public void init(SocketWrapperBase<Socket> socketWrapper) { // NO-OP: Unused } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org