protected void DumpEventLog()
{
if ( File.Exists( MeterEventsFilename ) )
File.Delete( MeterEventsFilename );
FileStream f = new FileStream( MeterEventsFilename, FileMode.Create, FileAccess.Write );
StreamWriter writer = new StreamWriter( f );
writer.Write( string.Format( "Dumping meter event log on {0} at {1}; units are usecs\r\n",
DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString() ) );
int indent = 0;
List<MeterStackEntry> meterStack = new List<MeterStackEntry>();
long firstEventTime = 0;
for ( int i = 0; i < eventTrace.Count; i++ )
{
short kind = eventTrace[ i ].eventKind;
long t = eventTrace[ i ].eventTime;
if ( i == 0 )
firstEventTime = t;
if ( kind == ekInfo )
{
writer.WriteLine( string.Format( "{0,12:D} {1}{2} {3}{4}",
ToMicroseconds( t - firstEventTime ),
IndentCount( indent ), "Info ", " ",
eventTrace[ i ].info ) );
continue;
}
TimingMeter meter = GetMeterById( eventTrace[ i ].meterId );
if ( kind == ekEnter )
{
indent++;
writer.WriteLine( string.Format( "{0,12:D} {1}{2} {3}.{4}",
ToMicroseconds( t - firstEventTime ),
IndentCount( indent ),
"Enter",
meter.category, meter.title ) );
meterStack.Add( new MeterStackEntry( meter, t ) );
}
else if ( kind == ekExit )
{
Debug.Assert( meterStack.Count > 0, "Meter stack is empty during ekExit" );
MeterStackEntry s = meterStack[ meterStack.Count - 1 ];
Debug.Assert( s.meter == meter, "Entered " + s.meter.title + "; Exiting " + meter.title );
writer.WriteLine( string.Format( "{0,12:D} {1}{2} {3}.{4}",
ToMicroseconds( t - s.eventTime ),
IndentCount( indent ),
"Exit ",
meter.category, meter.title ) );
indent--;
meterStack.RemoveAt( meterStack.Count - 1 );
}
}
writer.Close();
}