From e729ebc38f4b191733453ed65f56ed2b3b896f3b Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Sat, 19 Jun 2021 12:40:04 -0700 Subject: [PATCH] Update for new event that contains info about spin-wait pause/yield normalization --- src/TraceEvent/Parsers/ClrTraceEventParser.cs | 85 ++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/src/TraceEvent/Parsers/ClrTraceEventParser.cs b/src/TraceEvent/Parsers/ClrTraceEventParser.cs index 2267786fc..abac2b60e 100644 --- a/src/TraceEvent/Parsers/ClrTraceEventParser.cs +++ b/src/TraceEvent/Parsers/ClrTraceEventParser.cs @@ -970,6 +970,18 @@ public event Action ThreadPoolWo source.UnregisterEventTemplate(value, 102, ThreadPoolWorkerThreadAdjustmentTaskGuid); } } + public event Action YieldProcessorMeasurement + { + add + { + RegisterTemplate(YieldProcessorMeasurementTemplate(value)); + } + remove + { + source.UnregisterEventTemplate(value, 58, ProviderGuid); + source.UnregisterEventTemplate(value, 0, YieldProcessorMeasurementTaskGuid); + } + } public event Action ThreadPoolWorkingThreadCountStart { add @@ -2093,13 +2105,17 @@ static private ExecutionCheckpointTraceData ExecutionCheckpointTemplate(Action action) + { // action, eventid, taskid, taskName, taskGuid, opcode, opcodeName, providerGuid, providerName + return new YieldProcessorMeasurementTraceData(action, 58, 37, "YieldProcessorMeasurement", YieldProcessorMeasurementTaskGuid, 0, "Info", ProviderGuid, ProviderName); + } static private volatile TraceEvent[] s_templates; protected internal override void EnumerateTemplates(Func eventsToObserve, Action callback) { if (s_templates == null) { - var templates = new TraceEvent[140]; + var templates = new TraceEvent[141]; templates[0] = new GCStartTraceData(null, 1, 1, "GC", GCTaskGuid, 1, "Start", ProviderGuid, ProviderName); templates[1] = new GCEndTraceData(null, 2, 1, "GC", GCTaskGuid, 2, "Stop", ProviderGuid, ProviderName); templates[2] = new GCNoUserDataTraceData(null, 3, 1, "GC", GCTaskGuid, 132, "RestartEEStop", ProviderGuid, ProviderName); @@ -2248,6 +2264,7 @@ protected internal override void EnumerateTemplates(Func Action; #endregion } + public sealed class YieldProcessorMeasurementTraceData : TraceEvent + { + public int ClrInstanceID { get { return GetInt16At(0); } } + public double NsPerYield { get { return GetDoubleAt(2); } } + public double EstablishedNsPerYield { get { return GetDoubleAt(10); } } + + #region Private + internal YieldProcessorMeasurementTraceData(Action target, int eventID, int task, string taskName, Guid taskGuid, int opcode, string opcodeName, Guid providerGuid, string providerName) + : base(eventID, task, taskName, taskGuid, opcode, opcodeName, providerGuid, providerName) + { + m_target = target; + } + protected internal override void Dispatch() + { + m_target(this); + } + protected internal override void Validate() + { + Debug.Assert(!(Version == 0 && EventDataLength != 18)); + Debug.Assert(!(Version > 0 && EventDataLength < 18)); + } + protected internal override Delegate Target + { + get { return m_target; } + set { m_target = (Action)value; } + } + public override StringBuilder ToXml(StringBuilder sb) + { + Prefix(sb); + XmlAttrib(sb, "ClrInstanceID", ClrInstanceID); + XmlAttrib(sb, "NsPerYield", NsPerYield); + XmlAttrib(sb, "EstablishedNsPerYield", EstablishedNsPerYield); + sb.Append("/>"); + return sb; + } + + public override string[] PayloadNames + { + get + { + if (payloadNames == null) + payloadNames = new string[] { "ClrInstanceID", "NsPerYield", "EstablishedNsPerYield" }; + return payloadNames; + } + } + + public override object PayloadValue(int index) + { + switch (index) + { + case 0: + return ClrInstanceID; + case 1: + return NsPerYield; + case 2: + return EstablishedNsPerYield; + default: + Debug.Assert(false, "Bad field index"); + return null; + } + } + + private event Action m_target; + #endregion + } public sealed class ThreadPoolWorkingThreadCountTraceData : TraceEvent { public int Count { get { return GetInt32At(0); } }