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 {