You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2015/01/08 14:09:31 UTC

svn commit: r1650265 - in /tomcat/trunk: java/org/apache/coyote/http11/ test/org/apache/coyote/http11/filters/

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org