FileDocCategorySizeDatePackage
Expirer.javaAPI DocGlassfish v2 API5894Fri May 04 22:33:18 BST 2007org.apache.tomcat.util.threads

Expirer

public final class Expirer extends Object implements ThreadPoolRunnable
Expire unused objects.

Fields Summary
private static com.sun.org.apache.commons.logging.Log
log
private int
checkInterval
private Reaper
reaper
ExpireCallback
expireCallback
static final int
INITIAL_SIZE
TimeStamp[]
managedObjs
TimeStamp[]
checkedObjs
int
managedLen
int
managedCount
private static final int
dL
Constructors Summary
public Expirer()


      
    
Methods Summary
public voidaddManagedObject(TimeStamp ts)

    
          
	synchronized( managedObjs ) {
	    if( managedCount >= managedLen ) {
		// What happens if expire is on the way ? Nothing,
		// expire will do it's job on the old array ( GC magic )
		// and the expired object will be marked as such
		// Same thing would happen ( and did ) with Hashtable
		TimeStamp newA[]=new TimeStamp[ 2 * managedLen ];
		System.arraycopy( managedObjs, 0, newA, 0, managedLen);
		managedObjs = newA;
		managedLen = 2 * managedLen;
	    }
	    managedObjs[managedCount]=ts;
	    managedCount++;
	}
    
private voiddebug(java.lang.String s)

          
        if (log.isDebugEnabled())
	    log.debug("Expirer: " + s );
    
public intgetCheckInterval()

	return checkInterval;
    
public java.lang.Object[]getInitData()

	return null;
    
public voidremoveManagedObject(TimeStamp ts)

	for( int i=0; i< managedCount; i++ ) {
	    if( ts == managedObjs[i] ) {
		synchronized( managedObjs ) {
		    managedObjs[ i ] = managedObjs[managedCount-1];
		    managedCount--;
		}
		return;
	    }
	}
    
public voidrunIt(java.lang.Object[] td)

	long timeNow = System.currentTimeMillis();
	if( dL > 2 ) debug( "Checking " + timeNow );
	int checkedCount;
	synchronized( managedObjs ) {
	    checkedCount=managedCount;
	    if(checkedObjs.length < checkedCount)
		checkedObjs = new TimeStamp[managedLen];
	    System.arraycopy( managedObjs, 0, checkedObjs, 0, checkedCount);
	}
	for( int i=0; i< checkedCount; i++ ) {
	    TimeStamp ts=checkedObjs[i];
	    checkedObjs[i] = null;
	    
	    if (ts==null || !ts.isValid())
		continue;
	    
	    long maxInactiveInterval = ts.getMaxInactiveInterval();
	    if( dL > 3 ) debug( "TS: " + maxInactiveInterval + " " +
				ts.getLastAccessedTime());
	    if (maxInactiveInterval < 0)
		continue;
	    
	    long timeIdle = timeNow - ts.getLastAccessedTime();
	    
	    if (timeIdle >= maxInactiveInterval) {
		if( expireCallback != null ) {
		    if( dL > 0 )
			debug( ts + " " + timeIdle + " " +
			       maxInactiveInterval );
		    expireCallback.expired( ts );
		}
	    }
	}
    
public voidsetCheckInterval(int checkInterval)

	this.checkInterval = checkInterval;
    
public voidsetExpireCallback(org.apache.tomcat.util.threads.Expirer$ExpireCallback cb)

	expireCallback=cb;
    
public voidstart()

	// Start the background reaper thread
	if( reaper==null) {
	    reaper=new Reaper("Expirer");
	    reaper.addCallback( this, checkInterval * 1000 );
	}
	
	reaper.startReaper();
    
public voidstop()

	reaper.stopReaper();