diff --git a/src/TraceEvent/Parsers/ClrTraceEventParser.cs b/src/TraceEvent/Parsers/ClrTraceEventParser.cs index d0564d42a..204c6b6cb 100644 --- a/src/TraceEvent/Parsers/ClrTraceEventParser.cs +++ b/src/TraceEvent/Parsers/ClrTraceEventParser.cs @@ -982,6 +982,18 @@ public event Action YieldProcessorMeasuremen source.UnregisterEventTemplate(value, 0, YieldProcessorMeasurementTaskGuid); } } + public event Action ThreadPoolMinMaxThreads + { + add + { + RegisterTemplate(ThreadPoolMinMaxThreadsTemplate(value)); + } + remove + { + source.UnregisterEventTemplate(value, 59, ProviderGuid); + source.UnregisterEventTemplate(value, 0, ThreadPoolMinMaxThreadsTaskGuid); + } + } public event Action ThreadPoolWorkingThreadCountStart { add @@ -2109,13 +2121,17 @@ static private YieldProcessorMeasurementTraceData YieldProcessorMeasurementTempl { // action, eventid, taskid, taskName, taskGuid, opcode, opcodeName, providerGuid, providerName return new YieldProcessorMeasurementTraceData(action, 58, 37, "YieldProcessorMeasurement", YieldProcessorMeasurementTaskGuid, 0, "Info", ProviderGuid, ProviderName); } + static private ThreadPoolMinMaxThreadsTraceData ThreadPoolMinMaxThreadsTemplate(Action action) + { // action, eventid, taskid, taskName, taskGuid, opcode, opcodeName, providerGuid, providerName + return new ThreadPoolMinMaxThreadsTraceData(action, 59, 38, "ThreadPoolMinMaxThreads", ThreadPoolMinMaxThreadsTaskGuid, 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[141]; + var templates = new TraceEvent[142]; 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); @@ -2266,6 +2282,8 @@ protected internal override void EnumerateTemplates(Func Action; #endregion } + public sealed class ThreadPoolMinMaxThreadsTraceData : TraceEvent + { + public int MinWorkerThreads { get { return GetInt16At(0); } } + public int MaxWorkerThreads { get { return GetInt16At(2); } } + public int MinIOCompletionThreads { get { return GetInt16At(4); } } + public int MaxIOCompletionThreads { get { return GetInt16At(6); } } + public int ClrInstanceID { get { return GetInt16At(8); } } + + #region Private + internal ThreadPoolMinMaxThreadsTraceData(Action action, 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) + { + Action = action; + } + protected internal override void Dispatch() + { + Action(this); + } + protected internal override Delegate Target + { + get { return Action; } + set { Action = (Action)value; } + } + protected internal override void Validate() + { + Debug.Assert(!(Version == 0 && EventDataLength != 10)); + Debug.Assert(!(Version > 0 && EventDataLength < 10)); + } + public override StringBuilder ToXml(StringBuilder sb) + { + Prefix(sb); + XmlAttrib(sb, "MinWorkerThreads", MinWorkerThreads); + XmlAttrib(sb, "MaxWorkerThreads", MaxWorkerThreads); + XmlAttrib(sb, "MinIOCompletionThreads", MinIOCompletionThreads); + XmlAttrib(sb, "MaxIOCompletionThreads", MaxIOCompletionThreads); + XmlAttrib(sb, "ClrInstanceID", ClrInstanceID); + sb.Append("/>"); + return sb; + } + + public override string[] PayloadNames + { + get + { + if (payloadNames == null) + { + payloadNames = new string[] { "MinWorkerThreads", "MaxWorkerThreads", "MinIOCompletionThreads", "MaxIOCompletionThreads", "ClrInstanceID"}; + } + + return payloadNames; + } + } + + public override object PayloadValue(int index) + { + switch (index) + { + case 0: + return MinWorkerThreads; + case 1: + return MaxWorkerThreads; + case 2: + return MinIOCompletionThreads; + case 3: + return MaxIOCompletionThreads; + case 4: + return ClrInstanceID; + default: + Debug.Assert(false, "Bad field index"); + return null; + } + } + + private event Action Action; + #endregion + } public sealed class ThreadPoolWorkerThreadAdjustmentSampleTraceData : TraceEvent { public double Throughput { get { return GetDoubleAt(0); } }