< prev index next >

src/java.naming/share/classes/com/sun/jndi/ldap/pool/Connections.java

Print this page

        

@@ -25,11 +25,10 @@
 
 package com.sun.jndi.ldap.pool;
 
 import java.util.ArrayList; // JDK 1.2
 import java.util.List;
-import java.util.Iterator;
 
 import java.lang.ref.Reference;
 import java.lang.ref.SoftReference;
 
 import javax.naming.NamingException;

@@ -289,27 +288,32 @@
      *
      * @param threshold an entry idle since this time has expired.
      * @return true if no more connections in list
      */
     synchronized boolean expire(long threshold) {
-        Iterator<ConnectionDesc> iter = conns.iterator();
-        ConnectionDesc entry;
-        while (iter.hasNext()) {
-            entry = iter.next();
-            if (entry.expire(threshold)) {
-                d("expire(): removing ", entry);
-                td("Expired ", entry);
+        List<ConnectionDesc> clonedConns;
+        synchronized(this) {
+            clonedConns = new ArrayList<>(conns);
+        }
+        List<ConnectionDesc> expired = new ArrayList<>();
 
-                iter.remove();  // remove from pool
+        for (ConnectionDesc entry : clonedConns) {
+            d("expire(): ", entry);
+            if (entry.expire(threshold)) {
+                expired.add(entry);
+                td("expire(): Expired ", entry);
+            }
+        }
 
+        synchronized (this) {
+            conns.removeAll(expired);
                 // Don't need to call notify() because we're
                 // removing only idle connections. If there were
                 // idle connections, then there should be no waiters.
-            }
-        }
         return conns.isEmpty();  // whether whole list has 'expired'
     }
+    }
 
     /**
      * Called when this instance of Connections has been removed from Pool.
      * This means that no one can get any pooled connections from this
      * Connections any longer. Expire all idle connections as of 'now'
< prev index next >