Skip to content

Commit 3f9b853

Browse files
authored
Use XElement instead of XmlElement and strings. (#3261)
1 parent b8832f0 commit 3f9b853

6 files changed

Lines changed: 258 additions & 337 deletions

File tree

‎src/BenchmarkDotNet.Diagnostics.Windows/ConcurrencyVisualizerProfiler.cs‎

Lines changed: 58 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Microsoft.Diagnostics.Tracing.Parsers;
1313
using Microsoft.Diagnostics.Tracing.Parsers.Kernel;
1414
using Microsoft.Diagnostics.Tracing.Session;
15+
using System.Xml.Linq;
1516

1617
namespace BenchmarkDotNet.Diagnostics.Windows
1718
{
@@ -123,65 +124,72 @@ private string CreateCvTraceFile(DiagnoserActionParameters parameters)
123124
var cvPathFile = Path.ChangeExtension(traceFilePath, ".CvTrace");
124125
var traceFileName = Path.GetFileName(traceFilePath);
125126

126-
File.WriteAllText(cvPathFile,
127-
$@"<?xml version=""1.0""?>
128-
<ConcurrencyTrace xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" MajorVersion=""1"" MinorVersion=""0"">
129-
<Config MajorVersion=""1"" MinorVersion=""0"">
130-
<DeleteEtlsAfterAnalysis>false</DeleteEtlsAfterAnalysis>
131-
<TraceLocation>{directoryPath}</TraceLocation>
132-
<Markers>
133-
<MarkerProvider Name=""ConcurrencyVisualizer.Markers"" Guid=""{ConcurrencyVisualizerMarkersId}"" Level=""Low"" />
134-
<MarkerProvider Name=""System.Threading.Tasks"" Guid=""{TplEtwProviderTraceEventParser.ProviderGuid}"" Level=""Normal"" />
135-
<MarkerProvider Name=""System.Threading.Tasks.Dataflow"" Guid=""{TplDataflowId}"" Level=""Normal"" />
136-
<MarkerProvider Name=""System.Threading"" Guid=""{TplSynchronizationId}"" Level=""Normal"" />
137-
<MarkerProvider Name=""System.Collections.Concurrent"" Guid=""{ManagedConcurrentCollectionsId}"" Level=""Normal"" />
138-
<MarkerProvider Name=""System.Linq.Parallel"" Guid=""{PlinqId}"" Level=""Normal"" />
139-
</Markers>
140-
<FilterConfig>
141-
<CollectClrEvents>true</CollectClrEvents>
142-
<ClrCollectionOptions>None</ClrCollectionOptions>
143-
<CollectSampleEvents>true</CollectSampleEvents>
144-
<CollectGpuEvents>false</CollectGpuEvents>
145-
<CollectFileIO>true</CollectFileIO>
146-
</FilterConfig>
147-
<UserBufferSettings>
148-
<BufferFlushTimer>0</BufferFlushTimer>
149-
<BufferSize>256</BufferSize>
150-
<MinimumBuffers>512</MinimumBuffers>
151-
<MaximumBuffers>1024</MaximumBuffers>
152-
</UserBufferSettings>
153-
<KernelBufferSettings>
154-
<BufferFlushTimer>0</BufferFlushTimer>
155-
<BufferSize>256</BufferSize>
156-
<MinimumBuffers>512</MinimumBuffers>
157-
<MaximumBuffers>1024</MaximumBuffers>
158-
</KernelBufferSettings>
159-
{GenerateCodeInfo(parameters)}
160-
</Config>
161-
<Pid>{processId}</Pid>
162-
<EtwSourceFileNames>
163-
<EtwSourceFile>{traceFileName}</EtwSourceFile>
164-
</EtwSourceFileNames>
165-
<TraceProcesses />
166-
<NtToDosMaps>
167-
<NtToDosNameMap NtName=""\??\"" DosName="""" />
168-
<NtToDosNameMap NtName=""\SystemRoot\"" DosName=""C:\WINDOWS\"" />
169-
<NtToDosNameMap NtName=""\Windows\"" DosName=""C:\WINDOWS\"" />
170-
</NtToDosMaps>
171-
</ConcurrencyTrace>
172-
");
127+
var trace = new XElement("ConcurrencyTrace",
128+
new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
129+
new XAttribute(XNamespace.Xmlns + "xsd", "http://www.w3.org/2001/XMLSchema"),
130+
new XAttribute("MajorVersion", "1"),
131+
new XAttribute("MinorVersion", "0"),
132+
new XElement("Config",
133+
new XAttribute("MajorVersion", "1"),
134+
new XAttribute("MinorVersion", "0"),
135+
new XElement("DeleteEtlsAfterAnalysis", "false"),
136+
new XElement("TraceLocation", directoryPath),
137+
new XElement("Markers",
138+
MarkerProvider("ConcurrencyVisualizer.Markers", ConcurrencyVisualizerMarkersId, "Low"),
139+
MarkerProvider("System.Threading.Tasks", TplEtwProviderTraceEventParser.ProviderGuid, "Normal"),
140+
MarkerProvider("System.Threading.Tasks.Dataflow", TplDataflowId, "Normal"),
141+
MarkerProvider("System.Threading", TplSynchronizationId, "Normal"),
142+
MarkerProvider("System.Collections.Concurrent", ManagedConcurrentCollectionsId, "Normal"),
143+
MarkerProvider("System.Linq.Parallel", PlinqId, "Normal")),
144+
new XElement("FilterConfig",
145+
new XElement("CollectClrEvents", "true"),
146+
new XElement("ClrCollectionOptions", "None"),
147+
new XElement("CollectSampleEvents", "true"),
148+
new XElement("CollectGpuEvents", "false"),
149+
new XElement("CollectFileIO", "true")),
150+
BufferSettings("UserBufferSettings"),
151+
BufferSettings("KernelBufferSettings"),
152+
GenerateCodeInfo(parameters)),
153+
new XElement("Pid", processId),
154+
new XElement("EtwSourceFileNames",
155+
new XElement("EtwSourceFile", traceFileName)),
156+
new XElement("TraceProcesses"),
157+
new XElement("NtToDosMaps",
158+
NtToDosNameMap(@"\??\", ""),
159+
NtToDosNameMap(@"\SystemRoot\", @"C:\WINDOWS\"),
160+
NtToDosNameMap(@"\Windows\", @"C:\WINDOWS\")));
161+
162+
new XDocument(new XDeclaration("1.0", null, null), trace).Save(cvPathFile);
173163

174164
return cvPathFile;
175165
}
176166

177-
private string GenerateCodeInfo(DiagnoserActionParameters parameters)
167+
private static XElement MarkerProvider(string name, Guid id, string level)
168+
=> new("MarkerProvider",
169+
new XAttribute("Name", name),
170+
new XAttribute("Guid", id),
171+
new XAttribute("Level", level));
172+
173+
private static XElement BufferSettings(string name)
174+
=> new(name,
175+
new XElement("BufferFlushTimer", "0"),
176+
new XElement("BufferSize", "256"),
177+
new XElement("MinimumBuffers", "512"),
178+
new XElement("MaximumBuffers", "1024"));
179+
180+
private static XElement NtToDosNameMap(string ntName, string dosName)
181+
=> new("NtToDosNameMap",
182+
new XAttribute("NtName", ntName),
183+
new XAttribute("DosName", dosName));
184+
185+
private XElement GenerateCodeInfo(DiagnoserActionParameters parameters)
178186
{
179187
if (!parameters.Config.Options.IsSet(ConfigOptions.KeepBenchmarkFiles))
180-
return "<JustMyCode />";
188+
return new XElement("JustMyCode");
181189

182190
var folderWithDlls = Path.GetDirectoryName(parameters.BenchmarkCase.Descriptor.Type.Assembly.Location);
183191

184-
return $"<JustMyCode><MyCodeDirectory>{folderWithDlls}</MyCodeDirectory></JustMyCode>";
192+
return new XElement("JustMyCode", new XElement("MyCodeDirectory", folderWithDlls));
185193
}
186194
}
187195
}

0 commit comments

Comments
 (0)