diff options
Diffstat (limited to 'src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/TraceLogging/TraceLoggingEventSource.cs')
-rw-r--r-- | src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/TraceLogging/TraceLoggingEventSource.cs | 76 |
1 files changed, 45 insertions, 31 deletions
diff --git a/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/TraceLogging/TraceLoggingEventSource.cs b/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/TraceLogging/TraceLoggingEventSource.cs index 4348df7d6..0553f9899 100644 --- a/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/TraceLogging/TraceLoggingEventSource.cs +++ b/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/TraceLogging/TraceLoggingEventSource.cs @@ -47,6 +47,10 @@ namespace System.Diagnostics.Tracing private byte[] providerMetadata; #endif +#if FEATURE_PERFTRACING + private readonly TraceLoggingEventHandleTable m_eventHandleTable = new TraceLoggingEventHandleTable(); +#endif + /// <summary> /// Construct an EventSource with a given name for non-contract based events (e.g. those using the Write() API). /// </summary> @@ -431,15 +435,22 @@ namespace System.Diagnostics.Tracing identity = nameInfo.identity; EventDescriptor descriptor = new EventDescriptor(identity, level, opcode, (long)keywords); +#if FEATURE_PERFTRACING + IntPtr eventHandle = nameInfo.GetOrCreateEventHandle(m_eventPipeProvider, m_eventHandleTable, descriptor, eventTypes); + Debug.Assert(eventHandle != IntPtr.Zero); +#else + IntPtr eventHandle = IntPtr.Zero; +#endif + var pinCount = eventTypes.pinCount; var scratch = stackalloc byte[eventTypes.scratchSize]; var descriptors = stackalloc EventData[eventTypes.dataCount + 3]; for(int i = 0; i < eventTypes.dataCount + 3; i++) - descriptors[i] = default(EventData); + descriptors[i] = default; var pins = stackalloc GCHandle[pinCount]; for (int i = 0; i < pinCount; i++) - pins[i] = default(GCHandle); + pins[i] = default; fixed (byte* pMetadata0 = this.providerMetadata, @@ -472,6 +483,7 @@ namespace System.Diagnostics.Tracing this.WriteEventRaw( eventName, ref descriptor, + eventHandle, activityID, childActivityID, (int)(DataCollector.ThreadInstance.Finish() - descriptors), @@ -538,12 +550,19 @@ namespace System.Diagnostics.Tracing return; } +#if FEATURE_PERFTRACING + IntPtr eventHandle = nameInfo.GetOrCreateEventHandle(m_eventPipeProvider, m_eventHandleTable, descriptor, eventTypes); + Debug.Assert(eventHandle != IntPtr.Zero); +#else + IntPtr eventHandle = IntPtr.Zero; +#endif + // We make a descriptor for each EventData, and because we morph strings to counted strings // we may have 2 for each arg, so we allocate enough for this. var descriptorsLength = eventTypes.dataCount + eventTypes.typeInfos.Length * 2 + 3; var descriptors = stackalloc EventData[descriptorsLength]; for(int i = 0; i < descriptorsLength; i++) - descriptors[i] = default(EventData); + descriptors[i] = default; fixed (byte* pMetadata0 = this.providerMetadata, @@ -557,35 +576,20 @@ namespace System.Diagnostics.Tracing for (int i = 0; i < eventTypes.typeInfos.Length; i++) { - // Until M3, we need to morph strings to a counted representation - // When TDH supports null terminated strings, we can remove this. - if (eventTypes.typeInfos[i].DataType == typeof(string)) - { - // Write out the size of the string - descriptors[numDescrs].DataPointer = (IntPtr) (&descriptors[numDescrs + 1].m_Size); - descriptors[numDescrs].m_Size = 2; - numDescrs++; - - descriptors[numDescrs].m_Ptr = data[i].m_Ptr; - descriptors[numDescrs].m_Size = data[i].m_Size - 2; // Remove the null terminator - numDescrs++; - } - else - { - descriptors[numDescrs].m_Ptr = data[i].m_Ptr; - descriptors[numDescrs].m_Size = data[i].m_Size; + descriptors[numDescrs].m_Ptr = data[i].m_Ptr; + descriptors[numDescrs].m_Size = data[i].m_Size; - // old conventions for bool is 4 bytes, but meta-data assumes 1. - if (data[i].m_Size == 4 && eventTypes.typeInfos[i].DataType == typeof(bool)) - descriptors[numDescrs].m_Size = 1; + // old conventions for bool is 4 bytes, but meta-data assumes 1. + if (data[i].m_Size == 4 && eventTypes.typeInfos[i].DataType == typeof(bool)) + descriptors[numDescrs].m_Size = 1; - numDescrs++; - } + numDescrs++; } this.WriteEventRaw( eventName, ref descriptor, + eventHandle, activityID, childActivityID, numDescrs, @@ -615,16 +619,23 @@ namespace System.Diagnostics.Tracing return; } +#if FEATURE_PERFTRACING + IntPtr eventHandle = nameInfo.GetOrCreateEventHandle(m_eventPipeProvider, m_eventHandleTable, descriptor, eventTypes); + Debug.Assert(eventHandle != IntPtr.Zero); +#else + IntPtr eventHandle = IntPtr.Zero; +#endif + #if FEATURE_MANAGED_ETW var pinCount = eventTypes.pinCount; var scratch = stackalloc byte[eventTypes.scratchSize]; var descriptors = stackalloc EventData[eventTypes.dataCount + 3]; for(int i=0; i<eventTypes.dataCount + 3; i++) - descriptors[i] = default(EventData); + descriptors[i] = default; var pins = stackalloc GCHandle[pinCount]; for (int i = 0; i < pinCount; i++) - pins[i] = default(GCHandle); + pins[i] = default; fixed (byte* pMetadata0 = this.providerMetadata, @@ -637,7 +648,7 @@ namespace System.Diagnostics.Tracing #endif // FEATURE_MANAGED_ETW #if (!ES_BUILD_PCL && !ES_BUILD_PN) - System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions(); + System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions(); #endif EventOpcode opcode = (EventOpcode)descriptor.Opcode; @@ -677,6 +688,7 @@ namespace System.Diagnostics.Tracing this.WriteEventRaw( eventName, ref descriptor, + eventHandle, pActivityId, pRelatedActivityId, (int)(DataCollector.ThreadInstance.Finish() - descriptors), @@ -687,7 +699,7 @@ namespace System.Diagnostics.Tracing if (m_Dispatchers != null) { var eventData = (EventPayload)(eventTypes.typeInfos[0].GetData(data)); - WriteToAllListeners(eventName, ref descriptor, nameInfo.tags, pActivityId, eventData); + WriteToAllListeners(eventName, ref descriptor, nameInfo.tags, pActivityId, pRelatedActivityId, eventData); } } @@ -716,7 +728,7 @@ namespace System.Diagnostics.Tracing } } - private unsafe void WriteToAllListeners(string eventName, ref EventDescriptor eventDescriptor, EventTags tags, Guid* pActivityId, EventPayload payload) + private unsafe void WriteToAllListeners(string eventName, ref EventDescriptor eventDescriptor, EventTags tags, Guid* pActivityId, Guid* pChildActivityId, EventPayload payload) { EventWrittenEventArgs eventCallbackArgs = new EventWrittenEventArgs(this); eventCallbackArgs.EventName = eventName; @@ -728,7 +740,9 @@ namespace System.Diagnostics.Tracing // Self described events do not have an id attached. We mark it internally with -1. eventCallbackArgs.EventId = -1; if (pActivityId != null) - eventCallbackArgs.RelatedActivityId = *pActivityId; + eventCallbackArgs.ActivityId = *pActivityId; + if (pChildActivityId != null) + eventCallbackArgs.RelatedActivityId = *pChildActivityId; if (payload != null) { |