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 {