wasCSharpSQLite – Rev 1

Subversion Repositories:
Rev:
/* 
* 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
}