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


Reply via email to