Author: markt Date: Wed Mar 23 17:05:57 2011 New Revision: 1084642 URL: http://svn.apache.org/viewvc?rev=1084642&view=rev Log: Fix POOL-180. Only stop tracking objects for a key when there are no idle objects, no active objects and no objects being processed.
Modified: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.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=1084642&r1=1084641&r2=1084642&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 Wed Mar 23 17:05:57 2011 @@ -998,7 +998,9 @@ public class GenericKeyedObjectPool<K,V> // key references is the key of the list it belongs to. K key = entry.getValue(); ObjectTimestampPair<V> pairTimeStamp = entry.getKey(); - final CursorableLinkedList<ObjectTimestampPair<V>> list = _poolMap.get(key).queue; + ObjectQueue objectQueue = _poolMap.get(key); + final CursorableLinkedList<ObjectTimestampPair<V>> list = + objectQueue.queue; list.remove(pairTimeStamp); if (toDestroy.containsKey(key)) { @@ -1008,13 +1010,8 @@ public class GenericKeyedObjectPool<K,V> listForKey.add(pairTimeStamp); toDestroy.put(key, listForKey); } - // if that was the last object for that key, drop that pool - if (list.isEmpty()) { - _poolMap.remove(key); - _poolList.remove(key); - } + objectQueue.incrementInternalProcessingCount(); _totalIdle--; - _totalInternalProcessing++; itemsToRemove--; } @@ -1070,7 +1067,16 @@ public class GenericKeyedObjectPool<K,V> // ignore error, keep destroying the rest } finally { synchronized (this) { - _totalInternalProcessing--; + ObjectQueue objectQueue = _poolMap.get(key); + if (objectQueue != null) { + objectQueue.decrementInternalProcessingCount(); + if (objectQueue.internalProcessingCount == 0 && + objectQueue.activeCount == 0 && + objectQueue.queue.isEmpty()) { + _poolMap.remove(key); + _poolList.remove(key); + } + } allocate(); } }