commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ma...@apache.org
Subject svn commit: r1164053 - in /commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl: GenericKeyedObjectPool.java GenericObjectPool.java
Date Thu, 01 Sep 2011 12:51:04 GMT
Author: markt
Date: Thu Sep  1 12:51:04 2011
New Revision: 1164053

URL: http://svn.apache.org/viewvc?rev=1164053&view=rev
Log:
Make close() thread safe and ensure multiple calls to close() are handled correctly

Modified:
    commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
    commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java

Modified: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java?rev=1164053&r1=1164052&r2=1164053&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
(original)
+++ commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
Thu Sep  1 12:51:04 2011
@@ -1093,15 +1093,26 @@ public class GenericKeyedObjectPool<K,T>
       */
      @Override
      public void close() throws Exception {
-         super.close();
-         clear();
-         evictionIterator = null;
-         evictionKeyIterator = null;
-         startEvictor(-1L);
-         if (oname != null) {
-             ManagementFactory.getPlatformMBeanServer().unregisterMBean(oname);
-             oname = null;
+         if (isClosed()) {
+             return;
          }
+
+         synchronized (closeLock) {
+             if (isClosed()) {
+                 return;
+             }
+
+             super.close();
+             clear();
+             evictionIterator = null;
+             evictionKeyIterator = null;
+             startEvictor(-1L);
+             if (oname != null) {
+                 ManagementFactory.getPlatformMBeanServer().unregisterMBean(
+                         oname);
+             }
+         }
+
      }
 
      
@@ -1947,6 +1958,9 @@ public class GenericKeyedObjectPool<K,T>
      */
     private K evictionKey = null;
 
+    /** Object used to ensure closed() is only called once. */
+    private final Object closeLock = new Object();
+
     // JMX specific attributes
     private static final int AVERAGE_TIMING_STATS_CACHE_SIZE = 100;
     private AtomicLong borrowedCount = new AtomicLong(0);

Modified: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java?rev=1164053&r1=1164052&r2=1164053&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java
(original)
+++ commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java
Thu Sep  1 12:51:04 2011
@@ -1002,12 +1002,22 @@ public class GenericObjectPool<T> extend
      */
     @Override
     public void close() throws Exception {
-        super.close();
-        clear();
-        startEvictor(-1L);
-        if (oname != null) {
-            ManagementFactory.getPlatformMBeanServer().unregisterMBean(oname);
-            oname = null;
+        if (isClosed()) {
+            return;
+        }
+
+        synchronized (closeLock) {
+            if (isClosed()) {
+                return;
+            }
+
+            super.close();
+            clear();
+            startEvictor(-1L);
+            if (oname != null) {
+                ManagementFactory.getPlatformMBeanServer().unregisterMBean(
+                        oname);
+            }
         }
     }
 
@@ -1541,6 +1551,9 @@ public class GenericObjectPool<T> extend
     /** An iterator for {@link #idleObjects} that is used by the evictor. */
     private Iterator<PooledObject<T>> evictionIterator = null;
 
+    /** Object used to ensure closed() is only called once. */
+    private final Object closeLock = new Object();
+
     // JMX specific attributes
     private static final int AVERAGE_TIMING_STATS_CACHE_SIZE = 100;
     private AtomicLong borrowedCount = new AtomicLong(0);



Mime
View raw message