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();
                     }
                 }


Reply via email to