wasCSharpSQLite – Rev
?pathlinks?
/*
* 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
}