Index: src/test/org/apache/commons/pool/impl/TestGenericKeyedObjectPool.java =================================================================== --- src/test/org/apache/commons/pool/impl/TestGenericKeyedObjectPool.java (revision 469254) +++ src/test/org/apache/commons/pool/impl/TestGenericKeyedObjectPool.java (working copy) @@ -583,14 +583,14 @@ assertTrue("Should be 5 idle, found " + pool.getNumIdle(),pool.getNumIdle() == 5); } - public void testFIFO() throws Exception { + public void testLIFO() throws Exception { final Object key = "key"; pool.addObject(key); // "key0" pool.addObject(key); // "key1" pool.addObject(key); // "key2" + assertEquals("Youngest", "key2", pool.borrowObject(key)); + assertEquals("Middle", "key1", pool.borrowObject(key)); assertEquals("Oldest", "key0", pool.borrowObject(key)); - assertEquals("Middle", "key1", pool.borrowObject(key)); - assertEquals("Youngest", "key2", pool.borrowObject(key)); assertEquals("new-3", "key3", pool.borrowObject(key)); pool.returnObject(key, "r"); assertEquals("returned", "r", pool.borrowObject(key)); @@ -679,11 +679,11 @@ } protected boolean isLifo() { - return false; + return true; } protected boolean isFifo() { - return true; + return false; } } Index: src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java =================================================================== --- src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java (revision 469268) +++ src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java (working copy) @@ -1056,7 +1056,7 @@ if(_maxIdle >= 0 && (pool.size() >= _maxIdle)) { shouldDestroy = true; } else if(success) { - pool.addLast(new ObjectTimestampPair(obj)); + pool.addFirst(new ObjectTimestampPair(obj)); _totalIdle++; } notifyAll(); @@ -1119,7 +1119,7 @@ if(_maxIdle >= 0 && (pool.size() >= _maxIdle)) { shouldDestroy = true; } else if(success) { - pool.addLast(new ObjectTimestampPair(obj)); + pool.addFirst(new ObjectTimestampPair(obj)); _totalIdle++; } notifyAll(); @@ -1207,17 +1207,10 @@ return; } key = keyIter.next(); + LinkedList list = (LinkedList)_poolMap.get(key); + objIter = list.listIterator(list.size()); } - // if we don't have a keyed object pool iterator - if (objIter == null) { - final LinkedList list = (LinkedList)_poolMap.get(key); - if (_evictLastIndex < 0 || _evictLastIndex > list.size()) { - _evictLastIndex = list.size(); - } - objIter = list.listIterator(_evictLastIndex); - } - // if the _evictionCursor has a previous object, then test it if(objIter.hasPrevious()) { ObjectTimestampPair pair = (ObjectTimestampPair)(objIter.previous()); @@ -1267,8 +1260,7 @@ } else { // else done evicting keyed pool _recentlyEvictedKeys.add(key); - _evictLastIndex = -1; - objIter = null; + key = null; } } } @@ -1668,9 +1660,4 @@ * Idle object pool keys that have been evicted recently. */ private Set _recentlyEvictedKeys = null; - - /** - * Position in the _pool where the _evictor last stopped. - */ - private int _evictLastIndex = -1; }