Skip to content

Commit 496ab4d

Browse files
committed
Roughly handles WPP events to avoid RegisteredTraceEventParser assertions
1 parent 8850b34 commit 496ab4d

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

src/TraceEvent/RegisteredTraceEventParser.cs

+11-6
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,12 @@ internal override DynamicTraceEventData TryLookup(TraceEvent unknownEvent)
621621
/// </summary>
622622
internal static DynamicTraceEventData TryLookupWorker(TraceEvent unknownEvent, Dictionary<MapKey, IDictionary<long, string>> mapTable = null)
623623
{
624+
// We are not able to handle WPP events in this parser.
625+
if (unknownEvent.lookupAsWPP)
626+
{
627+
return null;
628+
}
629+
624630
// Is this a TraceLogging style
625631
DynamicTraceEventData ret = null;
626632

@@ -1192,7 +1198,7 @@ protected unsafe ExternalTraceEventParser(TraceEventSource source, bool dontRegi
11921198
parsedTemplate = TryLookup(unknown);
11931199
if (parsedTemplate == null)
11941200
{
1195-
m_state.m_templates.Add(unknown.Clone(), null); // add an entry to remember that we tried and failed.
1201+
m_state.m_templates.Add(unknown.CloneToTemplate(), null); // add an entry to remember that we tried and failed.
11961202
}
11971203
}
11981204
if (parsedTemplate == null)
@@ -1369,7 +1375,6 @@ internal class TraceEventComparer : IEqualityComparer<TraceEvent>
13691375
{
13701376
public bool Equals(TraceEvent x, TraceEvent y)
13711377
{
1372-
Debug.Assert(!(x.lookupAsWPP && x.lookupAsClassic));
13731378
if (x.lookupAsClassic != y.lookupAsClassic)
13741379
{
13751380
return false;
@@ -1380,15 +1385,15 @@ public bool Equals(TraceEvent x, TraceEvent y)
13801385
return false;
13811386
}
13821387

1383-
if (x.lookupAsClassic)
1388+
if (x.lookupAsWPP)
13841389
{
13851390
Debug.Assert(x.taskGuid != Guid.Empty && y.taskGuid != Guid.Empty);
1386-
return (x.taskGuid == y.taskGuid) && (x.Opcode == y.Opcode);
1391+
return (x.taskGuid == y.taskGuid) && (x.ID == y.ID);
13871392
}
1388-
else if (x.lookupAsWPP)
1393+
else if (x.lookupAsClassic)
13891394
{
13901395
Debug.Assert(x.taskGuid != Guid.Empty && y.taskGuid != Guid.Empty);
1391-
return (x.taskGuid == y.taskGuid) && (x.ID == y.ID);
1396+
return (x.taskGuid == y.taskGuid) && (x.Opcode == y.Opcode);
13921397
}
13931398
else
13941399
{

src/TraceEvent/TraceEvent.cs

+21-2
Original file line numberDiff line numberDiff line change
@@ -977,6 +977,14 @@ public bool IsClassicProvider
977977
// [SecuritySafeCritical]
978978
get { return (eventRecord->EventHeader.Flags & TraceEventNativeMethods.EVENT_HEADER_FLAG_CLASSIC_HEADER) != 0; }
979979
}
980+
/// <summary>
981+
/// Returns true if this event is from the TraceMessage function (typically indicates from a WPP provider)
982+
/// </summary>
983+
public bool IsTraceMessage
984+
{
985+
// [SecuritySafeCritical]
986+
get { return (eventRecord->EventHeader.Flags & TraceEventNativeMethods.EVENT_HEADER_FLAG_TRACE_MESSAGE) != 0; }
987+
}
980988

981989
/// <summary>
982990
/// The ID of the container that emitted the event, if available.
@@ -2015,9 +2023,18 @@ protected internal virtual void SetState(object state) { }
20152023

20162024
protected internal TraceEvent CloneToTemplate()
20172025
{
2018-
TraceEvent ret = Clone();
2026+
TraceEvent ret;
2027+
var record = eventRecord;
2028+
try
2029+
{
2030+
eventRecord = null;
2031+
ret = Clone();
2032+
}
2033+
finally
2034+
{
2035+
eventRecord = record;
2036+
}
20192037
ret.traceEventSource = null;
2020-
ret.eventRecord = null;
20212038
ret.Target = null;
20222039
return ret;
20232040
}
@@ -3663,6 +3680,7 @@ internal TraceEvent Lookup(TraceEventNativeMethods.EVENT_RECORD* eventRecord)
36633680

36643681
#if DEBUG // ASSERT we found the event using the mechanism we expected to use.
36653682
Debug.Assert(((eventRecord->EventHeader.Flags & TraceEventNativeMethods.EVENT_HEADER_FLAG_CLASSIC_HEADER) != 0) == curTemplate.lookupAsClassic);
3683+
Debug.Assert(((eventRecord->EventHeader.Flags & TraceEventNativeMethods.EVENT_HEADER_FLAG_TRACE_MESSAGE) != 0) == curTemplate.lookupAsWPP);
36663684
if (curTemplate.lookupAsClassic)
36673685
{
36683686
Debug.Assert(curTemplate.taskGuid == eventRecord->EventHeader.ProviderId);
@@ -3710,6 +3728,7 @@ internal TraceEvent Lookup(TraceEventNativeMethods.EVENT_RECORD* eventRecord)
37103728
unhandledEventTemplate.userData = eventRecord->UserData;
37113729
unhandledEventTemplate.eventIndex = currentID;
37123730
unhandledEventTemplate.lookupAsClassic = unhandledEventTemplate.IsClassicProvider;
3731+
unhandledEventTemplate.lookupAsWPP = unhandledEventTemplate.IsTraceMessage;
37133732
if ((((int)currentID) & 0xFFFF) == 0) // Every 64K events allow Thread.Interrupt.
37143733
{
37153734
System.Threading.Thread.Sleep(0);

src/TraceEvent/TraceEventNativeMethods.cs

+1
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ internal static extern int TraceQueryInformation(
399399
*/
400400

401401
internal const ushort EVENT_HEADER_FLAG_STRING_ONLY = 0x0004;
402+
internal const ushort EVENT_HEADER_FLAG_TRACE_MESSAGE = 0x0008;
402403
internal const ushort EVENT_HEADER_FLAG_NO_CPUTIME = 0x0010;
403404
internal const ushort EVENT_HEADER_FLAG_32_BIT_HEADER = 0x0020;
404405
internal const ushort EVENT_HEADER_FLAG_64_BIT_HEADER = 0x0040;

0 commit comments

Comments
 (0)