You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ma...@apache.org on 2014/09/24 12:26:51 UTC

svn commit: r1627270 - /commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java

Author: markt
Date: Wed Sep 24 10:26:51 2014
New Revision: 1627270

URL: http://svn.apache.org/r1627270
Log:
Improve fix in r1626998 (itself an improvement on the fix for POOL-161)
Handle the case where the developer has explicitly set the TCCL to null during the construction of the pool.

Modified:
    commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java

Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java?rev=1627270&r1=1627269&r2=1627270&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/BaseGenericObjectPool.java Wed Sep 24 10:26:51 2014
@@ -93,8 +93,8 @@ public abstract class BaseGenericObjectP
     private Evictor evictor = null; // @GuardedBy("evictionLock")
     Iterator<PooledObject<T>> evictionIterator = null; // @GuardedBy("evictionLock")
     /*
-     * Class loader for evictor thread to use since in a J2EE or similar
-     * environment the context class loader for the evictor thread may have
+     * Class loader for evictor thread to use since, in a JavaEE or similar
+     * environment, the context class loader for the evictor thread may not have
      * visibility of the correct factory. See POOL-161. Uses a weak reference to
      * avoid potential memory leaks if the Pool is discarded rather than closed.
      */
@@ -138,9 +138,14 @@ public abstract class BaseGenericObjectP
         // Populate the creation stack trace
         this.creationStackTrace = getStackTrace(new Exception());
 
-        // save the current CCL to be used later by the evictor Thread
-        factoryClassLoader = new WeakReference<ClassLoader>(
-                Thread.currentThread().getContextClassLoader());
+        // save the current TCCL (if any) to be used later by the evictor Thread
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        if (cl == null) {
+            factoryClassLoader = null;
+        } else {
+            factoryClassLoader = new WeakReference<ClassLoader>(cl);
+        }
+
         fairness = config.getFairness();
     }
 
@@ -1000,15 +1005,18 @@ public abstract class BaseGenericObjectP
             ClassLoader savedClassLoader =
                     Thread.currentThread().getContextClassLoader();
             try {
-                // Set the class loader for the factory
-                ClassLoader cl = factoryClassLoader.get();
-                if (cl == null) {
-                    // The pool has been dereferenced and the class loader GC'd.
-                    // Cancel this timer so the pool can be GC'd as well.
-                    cancel();
-                    return;
+                if (factoryClassLoader != null) {
+                    // Set the class loader for the factory
+                    ClassLoader cl = factoryClassLoader.get();
+                    if (cl == null) {
+                        // The pool has been dereferenced and the class loader
+                        // GC'd. Cancel this timer so the pool can be GC'd as
+                        // well.
+                        cancel();
+                        return;
+                    }
+                    Thread.currentThread().setContextClassLoader(cl);
                 }
-                Thread.currentThread().setContextClassLoader(cl);
 
                 // Evict from the pool
                 try {