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