Author: markt
Date: Wed Mar 23 12:08:15 2011
New Revision: 1084557

URL: http://svn.apache.org/viewvc?rev=1084557&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/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
    
commons/proper/pool/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericObjectPool.java

Modified: 
commons/proper/pool/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
URL: 
http://svn.apache.org/viewvc/commons/proper/pool/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java?rev=1084557&r1=1084556&r2=1084557&view=diff
==============================================================================
--- 
commons/proper/pool/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
 (original)
+++ 
commons/proper/pool/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
 Wed Mar 23 12:08:15 2011
@@ -1152,12 +1152,21 @@ public class GenericKeyedObjectPool exte
                                 }
                             } 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/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
URL: 
http://svn.apache.org/viewvc/commons/proper/pool/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericObjectPool.java?rev=1084557&r1=1084556&r2=1084557&view=diff
==============================================================================
--- 
commons/proper/pool/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
 (original)
+++ 
commons/proper/pool/branches/POOL_1_X/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
 Wed Mar 23 12:08:15 2011
@@ -1118,13 +1118,21 @@ public class GenericObjectPool extends B
                                 }
                             } 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