Author: rolandw
Date: Sun Feb  4 03:13:34 2007
New Revision: 503386

URL: http://svn.apache.org/viewvc?view=rev&rev=503386
Log:
HTTPCLIENT-625

Modified:
    jakarta/commons/proper/httpclient/trunk/release_notes.txt
    
jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java

Modified: jakarta/commons/proper/httpclient/trunk/release_notes.txt
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/httpclient/trunk/release_notes.txt?view=diff&rev=503386&r1=503385&r2=503386
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/release_notes.txt (original)
+++ jakarta/commons/proper/httpclient/trunk/release_notes.txt Sun Feb  4 
03:13:34 2007
@@ -1,4 +1,7 @@
-Changes since Release 3.1 Beta 1:
+Changes since Release 3.1 Beta 1:
+
+* [HTTPCLIENT-625] - revised shutdown of MultiThreadedHttpConnectionManager
+           Contributed by Roland Weber <rolandw at apache.org>
 
 * [HTTPCLIENT-622] - Leak in 
MultiThreadedHttpConnectionManager.ConnectionPool.mapHosts
            Contributed by Michael Becke <mbecke at apache.org> and Ortwin 
Glueck <oglueck at apache.org>
@@ -6,8 +9,8 @@
 * [HTTPCLIENT-612] - FileRequestEntity now always closes the input file.
            Contributed by Sebastian Bazley <sebb at apache.org>
 
-* [HTTPCLIENT-616] - HttpMethodDirector.executeWithRetry method fixed to close 
the 
-           underlying connection if a RuntimeException is thrown
+* [HTTPCLIENT-616] - HttpMethodDirector.executeWithRetry method fixed to close 
+           the underlying connection if a RuntimeException is thrown
            Contributed by Jason Bird
 
 * [HTTPCLIENT-606] - Added a HTTP method level parameter for URI charset

Modified: 
jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java?view=diff&rev=503386&r1=503385&r2=503386
==============================================================================
--- 
jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java
 (original)
+++ 
jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java
 Sun Feb  4 03:13:34 2007
@@ -113,12 +113,20 @@
         synchronized (REFERENCE_TO_CONNECTION_SOURCE) {
             // shutdown all connection managers
             synchronized (ALL_CONNECTION_MANAGERS) {
-                Iterator connIter = 
ALL_CONNECTION_MANAGERS.keySet().iterator();
-                while (connIter.hasNext()) {
-                    MultiThreadedHttpConnectionManager connManager = 
-                        (MultiThreadedHttpConnectionManager) connIter.next();
-                    connIter.remove();
-                    connManager.shutdown();
+                // Don't use an iterator here. Iterators on WeakHashMap can
+                // get ConcurrentModificationException on garbage collection.
+                MultiThreadedHttpConnectionManager[]
+                    connManagers = (MultiThreadedHttpConnectionManager[])
+                    ALL_CONNECTION_MANAGERS.keySet().toArray(
+                        new MultiThreadedHttpConnectionManager
+                            [ALL_CONNECTION_MANAGERS.size()]
+                        );
+
+                // The map may shrink after size() is called, or some entry
+                // may get GCed while the array is built, so expect null.
+                for (int i=0; i<connManagers.length; i++) {
+                    if (connManagers[i] != null)
+                        connManagers[i].shutdown();
                 }
             }
             
@@ -237,7 +245,7 @@
     /** Connection Pool */
     private ConnectionPool connectionPool;
 
-    private boolean shutdown = false;
+    private volatile boolean shutdown = false;
     
 
     // ----------------------------------------------------------- Constructors
@@ -259,7 +267,7 @@
      * Shuts down the connection manager and releases all resources.  All 
connections associated 
      * with this class will be closed and released. 
      * 
-     * <p>The connection manager can no longer be used once shutdown.  
+     * <p>The connection manager can no longer be used once shut down.  
      * 
      * <p>Calling this method more than once will have no effect.
      */
@@ -1033,7 +1041,7 @@
      */
     private static class ReferenceQueueThread extends Thread {
 
-        private boolean shutdown = false;
+        private volatile boolean shutdown = false;
         
         /**
          * Create an instance and make this a daemon thread.
@@ -1045,6 +1053,7 @@
 
         public void shutdown() {
             this.shutdown = true;
+            this.interrupt();
         }
         
         /**
@@ -1078,10 +1087,8 @@
         public void run() {
             while (!shutdown) {
                 try {
-                    // remove the next reference and process it, a timeout 
-                    // is used so that the thread does not block indefinitely 
-                    // and therefore keep the thread from shutting down
-                    Reference ref = REFERENCE_QUEUE.remove(1000);
+                    // remove the next reference and process it
+                    Reference ref = REFERENCE_QUEUE.remove();
                     if (ref != null) {
                         handleReference(ref);
                     }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to