wasCSharpSQLite – Rev
?pathlinks?
/*
* EventuallyFreed.java --
*
* This class makes sure that certain objects
* aren't disposed when there are nested procedures that
* depend on their existence.
*
* Copyright (c) 1991-1994 The Regents of the University of California.
* Copyright (c) 1994-1998 Sun Microsystems, Inc.
* Copyright (c) 2000 Christian Krone.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* Included in SQLite3 port to C# for use in testharness only; 2008 Noah B Hart
*
* RCS @(#) $Id: EventuallyFreed.java,v 1.2 2001/06/03 21:19:46 mdejong Exp $
*/
using System;
namespace tcl.lang
{
public abstract class EventuallyFreed
{
// Number of preserve() calls in effect for this object.
internal int refCount = 0;
// True means dispose() was called while a preserve()
// call was in effect, so the object must be disposed
// when refCount becomes zero.
internal bool mustFree = false;
// Procedure to call to dispose.
public abstract void eventuallyDispose();
internal void preserve()
{
// Just increment its reference count.
refCount++;
}
internal void release()
{
refCount--;
if ( refCount == 0 )
{
if ( mustFree )
{
dispose();
}
}
}
public void dispose()
{
// See if there is a reference for this pointer. If so, set its
// "mustFree" flag (the flag had better not be set already!).
if ( refCount >= 1 )
{
if ( mustFree )
{
throw new TclRuntimeError( "eventuallyDispose() called twice" );
}
mustFree = true;
return;
}
// No reference for this block. Free it now.
eventuallyDispose();
}
} // end EventuallyFreed
}