Author: markt
Date: Tue Mar 10 19:19:32 2015
New Revision: 1665653

URL: http://svn.apache.org/r1665653
Log:
While looking at BZ 57653 I found (and can reproduce with a debugger) an issue 
where sockets could end up being closed twice if they were in the poller, the 
connector is stopped and then closeSocket() was called.

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1665653&r1=1665652&r2=1665653&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Tue Mar 10 
19:19:32 2015
@@ -947,9 +947,7 @@ public class AprEndpoint extends Abstrac
         // countDownConnection() in that case
         Poller poller = this.poller;
         if (poller != null) {
-            if (!poller.close(socket)) {
-                destroySocket(socket);
-            }
+            poller.close(socket);
         }
     }
 
@@ -1420,9 +1418,24 @@ public class AprEndpoint extends Abstrac
             } catch (InterruptedException e) {
                 // Ignore
             }
+            // Close all sockets in the close queue
+            SocketInfo info = closeList.get();
+            while (info != null) {
+                // Make sure we aren't trying add the socket as well as close 
it
+                addList.remove(info.socket);
+                // Make sure the  socket isn't in the poller before we close it
+                removeFromPoller(info.socket);
+                // Poller isn't running at this point so use destroySocket()
+                // directly
+                destroySocket(info.socket);
+                info = closeList.get();
+            }
+            closeList.clear();
             // Close all sockets in the add queue
-            SocketInfo info = addList.get();
+            info = addList.get();
             while (info != null) {
+                // Make sure the  socket isn't in the poller before we close it
+                removeFromPoller(info.socket);
                 // Poller isn't running at this point so use destroySocket()
                 // directly
                 destroySocket(info.socket);
@@ -1516,17 +1529,10 @@ public class AprEndpoint extends Abstrac
         }
 
 
-        protected boolean close(long socket) {
-            if (!pollerRunning) {
-                return false;
-            }
+        protected void close(long socket) {
             synchronized (this) {
-                if (!pollerRunning) {
-                    return false;
-                }
                 closeList.add(socket, 0, 0);
                 this.notify();
-                return true;
             }
         }
 



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

Reply via email to