rwaldhoff 2002/10/31 10:56:11 Modified: pool/src/java/org/apache/commons/pool/impl GenericObjectPool.java Log: extract evict() from inner class make some protected stuff private Revision Changes Path 1.10 +105 -95 jakarta-commons/pool/src/java/org/apache/commons/pool/impl/GenericObjectPool.java Index: GenericObjectPool.java =================================================================== RCS file: /home/cvs/jakarta-commons/pool/src/java/org/apache/commons/pool/impl/GenericObjectPool.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- GenericObjectPool.java 30 Oct 2002 22:54:41 -0000 1.9 +++ GenericObjectPool.java 31 Oct 2002 18:56:11 -0000 1.10 @@ -1,5 +1,5 @@ /* - * $Header$ + * $Id$ * $Revision$ * $Date$ * @@ -7,7 +7,7 @@ * * The Apache Software License, Version 1.1 * - * Copyright (c) 1999-2002 The Apache Software Foundation. All rights + * Copyright (c) 2001-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -61,14 +61,13 @@ package org.apache.commons.pool.impl; -import org.apache.commons.pool.*; -import org.apache.commons.collections.CursorableLinkedList; -import org.apache.commons.collections.CursorableLinkedList.Cursor; import java.util.Iterator; import java.util.NoSuchElementException; -import java.util.Enumeration; -import java.util.EmptyStackException; -import java.util.ListIterator; + +import org.apache.commons.collections.CursorableLinkedList; +import org.apache.commons.pool.BaseObjectPool; +import org.apache.commons.pool.ObjectPool; +import org.apache.commons.pool.PoolableObjectFactory; /** * A configurable {@link ObjectPool} implementation. @@ -835,6 +834,10 @@ clear(); _pool = null; _factory = null; + if(null != _evictionCursor) { + _evictionCursor.close(); + _evictionCursor = null; + } if(null != _evictor) { _evictor.cancel(); _evictor = null; @@ -850,6 +853,66 @@ } } + public synchronized void evict() throws Exception { + if(!_pool.isEmpty()) { + if(null == _evictionCursor) { + _evictionCursor = (CursorableLinkedList.Cursor)(_pool.cursor(_pool.size())); + } else if(!_evictionCursor.hasPrevious()) { + _evictionCursor.close(); + _evictionCursor = (CursorableLinkedList.Cursor)(_pool.cursor(_pool.size())); + } + for(int i=0,m=getNumTests();i<m;i++) { + if(!_evictionCursor.hasPrevious()) { + _evictionCursor.close(); + _evictionCursor = (CursorableLinkedList.Cursor)(_pool.cursor(_pool.size())); + } else { + ObjectTimestampPair pair = (ObjectTimestampPair)(_evictionCursor.previous()); + if(_minEvictableIdleTimeMillis > 0 && + System.currentTimeMillis() - pair.tstamp > _minEvictableIdleTimeMillis) { + try { + _evictionCursor.remove(); + _factory.destroyObject(pair.value); + } catch(Exception e) { + ; // ignored + } + } else if(_testWhileIdle) { + boolean active = false; + try { + _factory.activateObject(pair.value); + active = true; + } catch(Exception e) { + _evictionCursor.remove(); + try { + _factory.passivateObject(pair.value); + } catch(Exception ex) { + ; // ignored + } + _factory.destroyObject(pair.value); + } + if(active) { + if(!_factory.validateObject(pair.value)) { + _evictionCursor.remove(); + try { + _factory.passivateObject(pair.value); + } catch(Exception ex) { + ; // ignored + } + _factory.destroyObject(pair.value); + } else { + try { + _factory.passivateObject(pair.value); + } catch(Exception e) { + _evictionCursor.remove(); + _factory.destroyObject(pair.value); + } + } + } + } + } + } + } + } + //--- package methods -------------------------------------------- synchronized String debugInfo() { @@ -866,6 +929,14 @@ return buf.toString(); } + private int getNumTests() { + if(_numTestsPerEvictionRun >= 0) { + return _numTestsPerEvictionRun; + } else { + return(int)(Math.ceil((double)_pool.size()/Math.abs((double)_numTestsPerEvictionRun))); + } + } + //--- inner classes ---------------------------------------------- /** @@ -898,7 +969,6 @@ } public void run() { - CursorableLinkedList.Cursor cursor = null; while(!_cancelled) { long sleeptime = 0L; synchronized(GenericObjectPool.this) { @@ -910,81 +980,19 @@ ; // ignored } try { - synchronized(GenericObjectPool.this) { - if(!_pool.isEmpty()) { - if(null == cursor) { - cursor = (CursorableLinkedList.Cursor)(_pool.cursor(_pool.size())); - } else if(!cursor.hasPrevious()) { - cursor.close(); - cursor = (CursorableLinkedList.Cursor)(_pool.cursor(_pool.size())); - } - for(int i=0,m=getNumTests();i<m;i++) { - if(!cursor.hasPrevious()) { - cursor.close(); - cursor = (CursorableLinkedList.Cursor)(_pool.cursor(_pool.size())); - } else { - ObjectTimestampPair pair = (ObjectTimestampPair)(cursor.previous()); - if(_minEvictableIdleTimeMillis > 0 && - System.currentTimeMillis() - pair.tstamp > _minEvictableIdleTimeMillis) { - try { - cursor.remove(); - _factory.destroyObject(pair.value); - } catch(Exception e) { - ; // ignored - } - } else if(_testWhileIdle) { - boolean active = false; - try { - _factory.activateObject(pair.value); - active = true; - } catch(Exception e) { - cursor.remove(); - try { - _factory.passivateObject(pair.value); - } catch(Exception ex) { - ; // ignored - } - _factory.destroyObject(pair.value); - } - if(active) { - if(!_factory.validateObject(pair.value)) { - cursor.remove(); - try { - _factory.passivateObject(pair.value); - } catch(Exception ex) { - ; // ignored - } - _factory.destroyObject(pair.value); - } else { - try { - _factory.passivateObject(pair.value); - } catch(Exception e) { - cursor.remove(); - _factory.destroyObject(pair.value); - } - } - } - } - } - } - } - } + evict(); } catch(Exception e) { // ignored } } - if(null != cursor) { - cursor.close(); + synchronized(GenericObjectPool.this) { + if(null != _evictionCursor) { + _evictionCursor.close(); + _evictionCursor = null; + } } } - private int getNumTests() { - if(_numTestsPerEvictionRun >= 0) { - return _numTestsPerEvictionRun; - } else { - return(int)(Math.ceil((double)_pool.size()/Math.abs((double)_numTestsPerEvictionRun))); - } - } } /** @@ -1006,21 +1014,21 @@ public long minEvictableIdleTimeMillis = GenericObjectPool.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; } - //--- protected attributes --------------------------------------- + //--- private attributes --------------------------------------- /** * The cap on the number of idle instances in the pool. * @see #setMaxIdle * @see #getMaxIdle */ - protected int _maxIdle = DEFAULT_MAX_IDLE; + private int _maxIdle = DEFAULT_MAX_IDLE; /** * The cap on the total number of active instances from the pool. * @see #setMaxActive * @see #getMaxActive */ - protected int _maxActive = DEFAULT_MAX_ACTIVE; + private int _maxActive = DEFAULT_MAX_ACTIVE; /** * The maximum amount of time (in millis) the @@ -1038,7 +1046,7 @@ * @see #setWhenExhaustedAction * @see #getWhenExhaustedAction */ - protected long _maxWait = DEFAULT_MAX_WAIT; + private long _maxWait = DEFAULT_MAX_WAIT; /** * The action to take when the {@link #borrowObject} method @@ -1052,7 +1060,7 @@ * @see #setWhenExhaustedAction * @see #getWhenExhaustedAction */ - protected byte _whenExhaustedAction = DEFAULT_WHEN_EXHAUSTED_ACTION; + private byte _whenExhaustedAction = DEFAULT_WHEN_EXHAUSTED_ACTION; /** * When <tt>true</tt>, objects will be @@ -1065,7 +1073,7 @@ * @see #setTestOnBorrow * @see #getTestOnBorrow */ - protected boolean _testOnBorrow = DEFAULT_TEST_ON_BORROW; + private boolean _testOnBorrow = DEFAULT_TEST_ON_BORROW; /** * When <tt>true</tt>, objects will be @@ -1076,7 +1084,7 @@ * @see #getTestOnReturn * @see #setTestOnReturn */ - protected boolean _testOnReturn = DEFAULT_TEST_ON_RETURN; + private boolean _testOnReturn = DEFAULT_TEST_ON_RETURN; /** * When <tt>true</tt>, objects will be @@ -1089,7 +1097,7 @@ * @see #getTimeBetweenEvictionRunsMillis * @see #setTimeBetweenEvictionRunsMillis */ - protected boolean _testWhileIdle = DEFAULT_TEST_WHILE_IDLE; + private boolean _testWhileIdle = DEFAULT_TEST_WHILE_IDLE; /** * The number of milliseconds to sleep between runs of the @@ -1100,7 +1108,7 @@ * @see #setTimeBetweenEvictionRunsMillis * @see #getTimeBetweenEvictionRunsMillis */ - protected long _timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; + private long _timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; /** * The number of objects to examine during each run of the @@ -1115,7 +1123,7 @@ * @see #getTimeBetweenEvictionRunsMillis * @see #setTimeBetweenEvictionRunsMillis */ - protected int _numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN; + private int _numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN; /** * The minimum amount of time an object may sit idle in the pool @@ -1129,22 +1137,24 @@ * @see #getTimeBetweenEvictionRunsMillis * @see #setTimeBetweenEvictionRunsMillis */ - protected long _minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; + private long _minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; /** My pool. */ - protected CursorableLinkedList _pool = null; + private CursorableLinkedList _pool = null; /** My {@link PoolableObjectFactory}. */ - protected PoolableObjectFactory _factory = null; + private PoolableObjectFactory _factory = null; /** * The number of objects {@link #borrowObject} borrowed * from the pool, but not yet returned. */ - protected int _numActive = 0; + private int _numActive = 0; /** * My idle object eviction thread, if any. */ - protected Evictor _evictor = null; + private Evictor _evictor = null; + + private CursorableLinkedList.Cursor _evictionCursor = null; }
-- To unsubscribe, e-mail: <mailto:commons-dev-unsubscribe@;jakarta.apache.org> For additional commands, e-mail: <mailto:commons-dev-help@;jakarta.apache.org>