protected void GenerateReport( StreamWriter writer, int start, Dictionary<string, string> options )
{
// For now, ignore options and just print the event trace
if ( dumpEventLog )
DumpEventLog();
// Zero the stack depth and added time
foreach ( KeyValuePair<int, TimingMeter> pair in instance.metersById )
{
TimingMeter meter = pair.Value;
meter.stackDepth = 0;
meter.addedTime = 0;
}
List<MeterStackEntry> meterStack = new List<MeterStackEntry>();
int indent = 0;
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 )
{
if ( meter.accumulate && meter.stackDepth == 0 )
meter.addedTime = 0;
if ( i >= start && ( !meter.accumulate || meter.stackDepth == 0 ) )
{
// Don't display the enter and exit if the
// exit is the very next record, and the
// elapsed usecs is less than DontDisplayUsecs
if ( eventTrace.Count > i + 1 && eventTrace[ i + 1 ].meterId == eventTrace[ i ].meterId &&
eventTrace[ i + 1 ].eventKind == ekExit &&
ToMicroseconds( eventTrace[ i + 1 ].eventTime - t ) < DontDisplayUsecs )
{
i++;
continue;
}
writer.WriteLine( string.Format( "{0,12:D} {1}{2} {3}{4}.{5}",
ToMicroseconds( t - firstEventTime ),
IndentCount( indent ), "Enter",
( meter.accumulate ? "*" : " " ),
meter.category, meter.title ) );
if ( !meter.accumulate )
indent++;
}
meter.stackDepth++;
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 ];
meter.stackDepth--;
Debug.Assert( s.meter == meter );
if ( meter.stackDepth > 0 && meter.accumulate )
meter.addedTime += t - s.eventTime;
else if ( i >= start )
{
if ( !meter.accumulate )
indent--;
writer.WriteLine( string.Format( "{0,12:D} {1}{2} {3}{4}.{5}",
ToMicroseconds( meter.accumulate ? meter.addedTime : t - s.eventTime ),
IndentCount( indent ), "Exit ",
( meter.accumulate ? "*" : " " ),
meter.category, meter.title ) );
}
meterStack.RemoveAt( meterStack.Count - 1 );
}
}
}