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 2022/02/17 15:39:26 UTC

[tomcat] branch 8.5.x updated: Align with 9.0.x onwards - Prep for backporting socket close changes

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 8.5.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/8.5.x by this push:
     new 67e70a2  Align with 9.0.x onwards - Prep for backporting socket close changes
67e70a2 is described below

commit 67e70a2fbe2b9d777406e33b3317267419414332
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Feb 17 15:39:15 2022 +0000

    Align with 9.0.x onwards - Prep for backporting socket close changes
---
 .../tomcat/util/net/ApplicationBufferHandler.java  | 15 ++++
 java/org/apache/tomcat/util/net/Nio2Channel.java   | 85 ++++++++++++++++++++++
 java/org/apache/tomcat/util/net/WriteBuffer.java   |  3 +
 3 files changed, 103 insertions(+)

diff --git a/java/org/apache/tomcat/util/net/ApplicationBufferHandler.java b/java/org/apache/tomcat/util/net/ApplicationBufferHandler.java
index d9a22ed..8362416 100644
--- a/java/org/apache/tomcat/util/net/ApplicationBufferHandler.java
+++ b/java/org/apache/tomcat/util/net/ApplicationBufferHandler.java
@@ -24,6 +24,21 @@ import java.nio.ByteBuffer;
  */
 public interface ApplicationBufferHandler {
 
+    static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocate(0);
+
+    static ApplicationBufferHandler EMPTY = new ApplicationBufferHandler() {
+        @Override
+        public void expand(int newSize) {
+        }
+        @Override
+        public void setByteBuffer(ByteBuffer buffer) {
+        }
+        @Override
+        public ByteBuffer getByteBuffer() {
+            return EMPTY_BUFFER;
+        }
+    };
+
     public void setByteBuffer(ByteBuffer buffer);
 
     public ByteBuffer getByteBuffer();
diff --git a/java/org/apache/tomcat/util/net/Nio2Channel.java b/java/org/apache/tomcat/util/net/Nio2Channel.java
index f5dd0f3..a22b7ab 100644
--- a/java/org/apache/tomcat/util/net/Nio2Channel.java
+++ b/java/org/apache/tomcat/util/net/Nio2Channel.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.AsynchronousByteChannel;
 import java.nio.channels.AsynchronousSocketChannel;
+import java.nio.channels.ClosedChannelException;
 import java.nio.channels.CompletionHandler;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -220,4 +221,88 @@ public class Nio2Channel implements AsynchronousByteChannel {
     protected ApplicationBufferHandler getAppReadBufHandler() {
         return appReadBufHandler;
     }
+
+    private static final Future<Integer> DONE_INT = new Future<Integer>() {
+        @Override
+        public boolean cancel(boolean mayInterruptIfRunning) {
+            return false;
+        }
+        @Override
+        public boolean isCancelled() {
+            return false;
+        }
+        @Override
+        public boolean isDone() {
+            return true;
+        }
+        @Override
+        public Integer get() throws InterruptedException,
+                ExecutionException {
+            return Integer.valueOf(-1);
+        }
+        @Override
+        public Integer get(long timeout, TimeUnit unit)
+                throws InterruptedException, ExecutionException,
+                TimeoutException {
+            return Integer.valueOf(-1);
+        }
+    };
+
+    static final Nio2Channel CLOSED_NIO2_CHANNEL = new Nio2Channel(SocketBufferHandler.EMPTY) {
+        @Override
+        public void close() throws IOException {
+        }
+        @Override
+        public boolean isOpen() {
+            return false;
+        }
+        @Override
+        public void reset(AsynchronousSocketChannel channel, SocketWrapperBase<Nio2Channel> socket) throws IOException {
+        }
+        @Override
+        public void free() {
+        }
+        @Override
+        protected ApplicationBufferHandler getAppReadBufHandler() {
+            return ApplicationBufferHandler.EMPTY;
+        }
+        @Override
+        public void setAppReadBufHandler(ApplicationBufferHandler handler) {
+        }
+        @Override
+        public Future<Integer> read(ByteBuffer dst) {
+            return DONE_INT;
+        }
+        @Override
+        public <A> void read(ByteBuffer dst,
+                long timeout, TimeUnit unit, A attachment,
+                CompletionHandler<Integer, ? super A> handler) {
+            handler.failed(new ClosedChannelException(), attachment);
+        }
+        @Override
+        public <A> void read(ByteBuffer[] dsts,
+                int offset, int length, long timeout, TimeUnit unit,
+                A attachment, CompletionHandler<Long,? super A> handler) {
+            handler.failed(new ClosedChannelException(), attachment);
+        }
+        @Override
+        public Future<Integer> write(ByteBuffer src) {
+            return DONE_INT;
+        }
+        @Override
+        public <A> void write(ByteBuffer src, long timeout, TimeUnit unit, A attachment,
+                CompletionHandler<Integer, ? super A> handler) {
+            handler.failed(new ClosedChannelException(), attachment);
+        }
+        @Override
+        public <A> void write(ByteBuffer[] srcs, int offset, int length,
+                long timeout, TimeUnit unit, A attachment,
+                CompletionHandler<Long,? super A> handler) {
+            handler.failed(new ClosedChannelException(), attachment);
+        }
+        @Override
+        public String toString() {
+            return "Closed Nio2Channel";
+        }
+    };
 }
diff --git a/java/org/apache/tomcat/util/net/WriteBuffer.java b/java/org/apache/tomcat/util/net/WriteBuffer.java
index 82e36c5..fa6599d 100644
--- a/java/org/apache/tomcat/util/net/WriteBuffer.java
+++ b/java/org/apache/tomcat/util/net/WriteBuffer.java
@@ -43,6 +43,9 @@ public class WriteBuffer {
         this.bufferSize = bufferSize;
     }
 
+    void clear() {
+        buffers.clear();
+    }
 
     void add(byte[] buf, int offset, int length) {
         ByteBufferHolder holder = getByteBufferHolder(length);

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org