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

remm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/master by this push:
     new 0690ecf  Use a latch again for blocking calls
0690ecf is described below

commit 0690ecfea39e3c3df93f4c0b88a57cf0a3bfa1ef
Author: remm <r...@apache.org>
AuthorDate: Mon Mar 9 10:53:01 2020 +0100

    Use a latch again for blocking calls
    
    Due to BZ64195, but it makes no difference for me. The code is simpler,
    so it cannot hurt to do that for now.
---
 java/org/apache/tomcat/util/net/NioEndpoint.java | 102 +++++++++--------------
 webapps/docs/changelog.xml                       |   7 ++
 2 files changed, 46 insertions(+), 63 deletions(-)

diff --git a/java/org/apache/tomcat/util/net/NioEndpoint.java 
b/java/org/apache/tomcat/util/net/NioEndpoint.java
index bbcf4ca..2019680 100644
--- a/java/org/apache/tomcat/util/net/NioEndpoint.java
+++ b/java/org/apache/tomcat/util/net/NioEndpoint.java
@@ -722,11 +722,8 @@ public class NioEndpoint extends 
AbstractJsseEndpoint<NioChannel,SocketChannel>
                                     if 
(!socketWrapper.readOperation.process()) {
                                         closeSocket = true;
                                     }
-                                } else if (socketWrapper.readBlocking) {
-                                    synchronized (socketWrapper.readLock) {
-                                        socketWrapper.readBlocking = false;
-                                        socketWrapper.readLock.notify();
-                                    }
+                                } else if (socketWrapper.readBlock != null) {
+                                    socketWrapper.readBlock.countDown();
                                 } else if (!processSocket(socketWrapper, 
SocketEvent.OPEN_READ, true)) {
                                     closeSocket = true;
                                 }
@@ -736,11 +733,8 @@ public class NioEndpoint extends 
AbstractJsseEndpoint<NioChannel,SocketChannel>
                                     if 
(!socketWrapper.writeOperation.process()) {
                                         closeSocket = true;
                                     }
-                                } else if (socketWrapper.writeBlocking) {
-                                    synchronized (socketWrapper.writeLock) {
-                                        socketWrapper.writeBlocking = false;
-                                        socketWrapper.writeLock.notify();
-                                    }
+                                } else if (socketWrapper.writeBlock != null) {
+                                    socketWrapper.writeBlock.countDown();
                                 } else if (!processSocket(socketWrapper, 
SocketEvent.OPEN_WRITE, true)) {
                                     closeSocket = true;
                                 }
@@ -981,18 +975,14 @@ public class NioEndpoint extends 
AbstractJsseEndpoint<NioChannel,SocketChannel>
         private volatile long lastRead = System.currentTimeMillis();
         private volatile long lastWrite = lastRead;
 
-        private final Object readLock;
-        private volatile boolean readBlocking = false;
-        private final Object writeLock;
-        private volatile boolean writeBlocking = false;
+        private CountDownLatch readBlock;
+        private CountDownLatch writeBlock;
 
         public NioSocketWrapper(NioChannel channel, NioEndpoint endpoint) {
             super(channel, endpoint);
             nioChannels = endpoint.getNioChannels();
             poller = endpoint.getPoller();
             socketBufferHandler = channel.getBufHandler();
-            readLock = (readPending == null) ? new Object() : readPending;
-            writeLock = (writePending == null) ? new Object() : writePending;
         }
 
         public Poller getPoller() { return poller; }
@@ -1149,30 +1139,23 @@ public class NioEndpoint extends 
AbstractJsseEndpoint<NioChannel,SocketChannel>
             if (block && nRead == 0) {
                 long timeout = getReadTimeout();
                 try {
-                    readBlocking = true;
+                    readBlock = new CountDownLatch(1);
                     registerReadInterest();
-                    synchronized (readLock) {
-                        if (readBlocking) {
-                            try {
-                                if (timeout > 0) {
-                                    readLock.wait(timeout);
-                                } else {
-                                    readLock.wait();
-                                }
-                            } catch (InterruptedException e) {
-                                // Continue ...
-                            }
-                            if (readBlocking) {
-                                throw new SocketTimeoutException();
-                            }
+                    if (timeout > 0) {
+                        if (!readBlock.await(timeout, TimeUnit.MILLISECONDS)) {
+                            throw new SocketTimeoutException();
                         }
+                    } else {
+                        readBlock.await();
                     }
-                    nRead = socket.read(to);
-                    if (nRead == -1) {
-                        throw new EOFException();
-                    }
+                } catch (InterruptedException e) {
+                    throw new EOFException();
                 } finally {
-                    readBlocking = false;
+                    readBlock = null;
+                }
+                nRead = socket.read(to);
+                if (nRead == -1) {
+                    throw new EOFException();
                 }
             }
             return nRead;
@@ -1187,37 +1170,30 @@ public class NioEndpoint extends 
AbstractJsseEndpoint<NioChannel,SocketChannel>
             }
             if (block) {
                 long timeout = getWriteTimeout();
-                try {
-                    int n = 0;
-                    do {
-                        n = socket.write(from);
-                        if (n == -1) {
-                            throw new EOFException();
-                        }
-                        if (n == 0) {
-                            writeBlocking = true;
+                int n = 0;
+                do {
+                    n = socket.write(from);
+                    if (n == -1) {
+                        throw new EOFException();
+                    }
+                    if (n == 0) {
+                        try {
+                            writeBlock = new CountDownLatch(1);
                             registerWriteInterest();
-                            synchronized (writeLock) {
-                                if (writeBlocking) {
-                                    try {
-                                        if (timeout > 0) {
-                                            writeLock.wait(timeout);
-                                        } else {
-                                            writeLock.wait();
-                                        }
-                                    } catch (InterruptedException e) {
-                                        // Continue ...
-                                    }
-                                    if (writeBlocking) {
-                                        throw new SocketTimeoutException();
-                                    }
+                            if (timeout > 0) {
+                                if (!writeBlock.await(timeout, 
TimeUnit.MILLISECONDS)) {
+                                    throw new SocketTimeoutException();
                                 }
+                            } else {
+                                writeBlock.await();
                             }
+                        } catch (InterruptedException e) {
+                            throw new EOFException();
+                        } finally {
+                            writeBlock = null;
                         }
-                    } while (from.hasRemaining());
-                } finally {
-                    writeBlocking = false;
-                }
+                    }
+                } while (from.hasRemaining());
                 // If there is data left in the buffer the socket will be 
registered for
                 // write further up the stack. This is to ensure the socket is 
only
                 // registered for write once as both container and user code 
can trigger
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 08b4493..112c8b6 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -45,6 +45,13 @@
   issues do not "pop up" wrt. others).
 -->
 <section name="Tomcat 10.0.0-M3 (markt)" rtext="in development">
+  <subsection name="Coyote">
+    <changelog>
+      <fix>
+        Use a latch again for NIO blocking reads and writes. (remm)
+      </fix>
+    </changelog>
+  </subsection>
 </section>
 <section name="Tomcat 10.0.0-M2 (markt)" rtext="release in progress">
   <subsection name="Catalina">


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

Reply via email to