wasCSharpSQLite – Rev 1

Subversion Repositories:
Rev:
/*
* TclEvent.java --
*
*       Abstract class for describing an event in the Tcl notifier
*       API.
*
* Copyright (c) 1997 Cornell University.
* Copyright (c) 1997 Sun Microsystems, Inc.
*
* 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: TclEvent.java,v 1.3 2003/03/11 01:45:53 mdejong Exp $
*
*/
using System;
namespace tcl.lang
{

  /*
  * This is an abstract class that describes an event in the Jacl
  * implementation of the notifier. It contains package protected
  * fields and methods that are accessed by the Jacl notifier. Tcl Blend
  * needs a different implementation of the TclEvent base class.
  *
  * The only public methods in this class are processEvent() and
  * sync(). These methods must appear in both the Jacl and Tcl Blend versions
  * of this class.
  */

  public abstract class TclEvent
  {

    /*
    * The notifier in which this event is queued.
    */

    internal Notifier notifier = null;

    /*
    * This flag is true if sync() has been called on this object.
    */

    internal bool needsNotify = false;

    /*
    * True if this event is current being processing. This flag provents
    * an event to be processed twice when the event loop is entered
    * recursively.
    */

    internal bool isProcessing = false;

    /*
    * True if this event has been processed.
    */

    internal bool isProcessed = false;

    /*
    * Links to the next event in the event queue.
    */

    internal TclEvent next;

    public abstract int processEvent( int flags ); // Same as flags passed to Notifier.doOneEvent.

    public void sync()
    {
      if ( notifier == null )
      {
        throw new TclRuntimeError( "TclEvent is not queued when sync() is called" );
      }

      if ( System.Threading.Thread.CurrentThread == notifier.primaryThread )
      {
        while ( !isProcessed )
        {
          notifier.serviceEvent( 0 );
        }
      }
      else
      {
        lock ( this )
        {
          needsNotify = true;
          while ( !isProcessed )
          {
            try
            {
              System.Threading.Monitor.Wait( this, TimeSpan.FromMilliseconds( 0 ) );
            }
            catch ( System.Threading.ThreadInterruptedException e )
            {
              // Another thread has sent us an "interrupt"
              // signal. We ignore it and continue waiting until
              // the event is processed.

              continue;
            }
          }
        }
      }
    }
  } // end TclEvent
}