Author: markt Date: Wed Mar 23 12:04:20 2011 New Revision: 1084555 URL: http://svn.apache.org/viewvc?rev=1084555&view=rev Log: Fix POOL-179. Correctly handle InterruptedException whilst waiting for an object from the pool. Based on a suggested patch by Axel Großmann
Modified: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.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=1084555&r1=1084554&r2=1084555&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 12:04:20 2011 @@ -747,12 +747,21 @@ public class GenericKeyedObjectPool<K,V> } } catch(InterruptedException e) { synchronized (this) { - // Make sure allocate hasn't already assigned an object - // in a different thread or permitted a new object to be created + // Need to handle the all three possibilities if (latch.getPair() == null && !latch.mayCreate()) { + // Case 1: latch still in allocation queue + // Remove latch from the allocation queue _allocationQueue.remove(latch); + } else if (latch.getPair() == null && latch.mayCreate()) { + // Case 2: latch has been given permission to create + // a new object + latch.getPool().decrementInternalProcessingCount(); + allocate(); } else { - break; + // Case 3: An object has been allocated + latch.getPool().decrementInternalProcessingCount(); + latch.getPool().incrementActiveCount(); + returnObject(latch.getkey(), latch.getPair().getValue()); } } Thread.currentThread().interrupt(); Modified: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java?rev=1084555&r1=1084554&r2=1084555&view=diff ============================================================================== --- commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java (original) +++ commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java Wed Mar 23 12:04:20 2011 @@ -720,13 +720,21 @@ public class GenericObjectPool<T> extend } } catch(InterruptedException e) { synchronized(this) { - // Make sure allocate hasn't already assigned an object - // in a different thread or permitted a new object to be created + // Need to handle the all three possibilities if (latch.getPair() == null && !latch.mayCreate()) { + // Case 1: latch still in allocation queue // Remove latch from the allocation queue _allocationQueue.remove(latch); + } else if (latch.getPair() == null && latch.mayCreate()) { + // Case 2: latch has been given permission to create + // a new object + _numInternalProcessing--; + allocate(); } else { - break; + // Case 3: An object has been allocated + _numInternalProcessing--; + _numActive++; + returnObject(latch.getPair().getValue()); } } Thread.currentThread().interrupt();