{
InternalWrite("<DataItem>");
if (data[i] != null)
+ {
WriteData(data[i]!);
+ }
InternalWrite("</DataItem>");
}
}
// Rewind the blob to point to the root, this is needed to support multiple XMLTL in one TraceData call
xmlBlob.MoveToRoot();
_xmlBlobWriter!.WriteNode(xmlBlob, false);
- InternalWrite(_strBldr.ToString());
+ InternalWrite(_strBldr);
}
catch (Exception)
{
{
WriteStartHeader(source, eventType, id, eventCache);
InternalWrite("\" RelatedActivityID=\"");
- InternalWrite(relatedActivityId.ToString("B"));
+ InternalWrite(relatedActivityId);
WriteEndHeader();
}
InternalWrite(FixedHeader);
InternalWrite("<EventID>");
- InternalWrite(((uint)id).ToString(CultureInfo.InvariantCulture));
+ InternalWrite((uint)id);
InternalWrite("</EventID>");
InternalWrite("<Type>3</Type>");
InternalWrite("\">0</SubType>");
InternalWrite("<Level>");
- int sev = (int)eventType;
- if (sev > 255)
- sev = 255;
- if (sev < 0)
- sev = 0;
- InternalWrite(sev.ToString(CultureInfo.InvariantCulture));
+ InternalWrite(Math.Clamp((int)eventType, 0, 255));
InternalWrite("</Level>");
InternalWrite("<TimeCreated SystemTime=\"");
- if (eventCache != null)
- InternalWrite(eventCache.DateTime.ToString("o", CultureInfo.InvariantCulture));
- else
- InternalWrite(DateTime.Now.ToString("o", CultureInfo.InvariantCulture));
+ InternalWrite(eventCache != null ? eventCache.DateTime : DateTime.Now);
InternalWrite("\" />");
InternalWrite("<Source Name=\"");
InternalWrite("\" />");
InternalWrite("<Correlation ActivityID=\"");
- if (eventCache != null)
- InternalWrite(Trace.CorrelationManager.ActivityId.ToString("B"));
- else
- InternalWrite(Guid.Empty.ToString("B"));
+ InternalWrite(eventCache != null ? Trace.CorrelationManager.ActivityId : Guid.Empty);
}
[ResourceExposure(ResourceScope.None)]
InternalWrite("<Execution ProcessName=\"");
InternalWrite(processName);
InternalWrite("\" ProcessID=\"");
- InternalWrite(((uint)Environment.ProcessId).ToString(CultureInfo.InvariantCulture));
+ InternalWrite((uint)Environment.ProcessId);
InternalWrite("\" ThreadID=\"");
- WriteEscaped(Environment.CurrentManagedThreadId.ToString(CultureInfo.InvariantCulture));
+ InternalWrite((uint)Environment.CurrentManagedThreadId);
InternalWrite("\" />");
InternalWrite("<Channel/>");
private void WriteFooter(TraceEventCache? eventCache)
{
- bool writeLogicalOps = IsEnabled(TraceOptions.LogicalOperationStack);
- bool writeCallstack = IsEnabled(TraceOptions.Callstack);
-
- if (eventCache != null && (writeLogicalOps || writeCallstack))
+ if (eventCache != null)
{
- InternalWrite("<System.Diagnostics xmlns=\"http://schemas.microsoft.com/2004/08/System.Diagnostics\">");
+ bool writeLogicalOps = IsEnabled(TraceOptions.LogicalOperationStack);
+ bool writeCallstack = IsEnabled(TraceOptions.Callstack);
- if (writeLogicalOps)
+ if (writeLogicalOps || writeCallstack)
{
- InternalWrite("<LogicalOperationStack>");
-
- Stack s = eventCache.LogicalOperationStack;
+ InternalWrite("<System.Diagnostics xmlns=\"http://schemas.microsoft.com/2004/08/System.Diagnostics\">");
- foreach (object? correlationId in s)
+ if (writeLogicalOps)
{
- InternalWrite("<LogicalOperation>");
- WriteEscaped(correlationId?.ToString());
- InternalWrite("</LogicalOperation>");
+ InternalWrite("<LogicalOperationStack>");
+ foreach (object? correlationId in eventCache.LogicalOperationStack)
+ {
+ InternalWrite("<LogicalOperation>");
+ WriteEscaped(correlationId?.ToString());
+ InternalWrite("</LogicalOperation>");
+ }
+ InternalWrite("</LogicalOperationStack>");
}
- InternalWrite("</LogicalOperationStack>");
- }
- InternalWrite("<Timestamp>");
- InternalWrite(eventCache.Timestamp.ToString(CultureInfo.InvariantCulture));
- InternalWrite("</Timestamp>");
+ InternalWrite("<Timestamp>");
+ InternalWrite(eventCache.Timestamp);
+ InternalWrite("</Timestamp>");
- if (writeCallstack)
- {
- InternalWrite("<Callstack>");
- WriteEscaped(eventCache.Callstack);
- InternalWrite("</Callstack>");
- }
+ if (writeCallstack)
+ {
+ InternalWrite("<Callstack>");
+ WriteEscaped(eventCache.Callstack);
+ InternalWrite("</Callstack>");
+ }
- InternalWrite("</System.Diagnostics>");
+ InternalWrite("</System.Diagnostics>");
+ }
}
InternalWrite("</ApplicationData></E2ETraceEvent>");
switch (str[i])
{
case '&':
- InternalWrite(str.Substring(lastIndex, i - lastIndex));
+ InternalWrite(str.AsSpan(lastIndex, i - lastIndex));
InternalWrite("&");
lastIndex = i + 1;
break;
case '<':
- InternalWrite(str.Substring(lastIndex, i - lastIndex));
+ InternalWrite(str.AsSpan(lastIndex, i - lastIndex));
InternalWrite("<");
lastIndex = i + 1;
break;
case '>':
- InternalWrite(str.Substring(lastIndex, i - lastIndex));
+ InternalWrite(str.AsSpan(lastIndex, i - lastIndex));
InternalWrite(">");
lastIndex = i + 1;
break;
case '"':
- InternalWrite(str.Substring(lastIndex, i - lastIndex));
+ InternalWrite(str.AsSpan(lastIndex, i - lastIndex));
InternalWrite(""");
lastIndex = i + 1;
break;
case '\'':
- InternalWrite(str.Substring(lastIndex, i - lastIndex));
+ InternalWrite(str.AsSpan(lastIndex, i - lastIndex));
InternalWrite("'");
lastIndex = i + 1;
break;
case (char)0xD:
- InternalWrite(str.Substring(lastIndex, i - lastIndex));
+ InternalWrite(str.AsSpan(lastIndex, i - lastIndex));
InternalWrite("
");
lastIndex = i + 1;
break;
case (char)0xA:
- InternalWrite(str.Substring(lastIndex, i - lastIndex));
+ InternalWrite(str.AsSpan(lastIndex, i - lastIndex));
InternalWrite("
");
lastIndex = i + 1;
break;
}
}
- InternalWrite(str.Substring(lastIndex, str.Length - lastIndex));
+ InternalWrite(str.AsSpan(lastIndex, str.Length - lastIndex));
}
private void InternalWrite(string? message)
EnsureWriter();
_writer?.Write(message);
}
+
+ private void InternalWrite(ReadOnlySpan<char> message)
+ {
+ EnsureWriter();
+ _writer?.Write(message);
+ }
+
+ private void InternalWrite<T>(T message) where T : ISpanFormattable
+ {
+ Debug.Assert(typeof(T) == typeof(int) || typeof(T) == typeof(uint) || typeof(T) == typeof(long), "We only currently stackalloc enough space for these types.");
+
+ EnsureWriter();
+ if (_writer is TextWriter writer)
+ {
+ Span<char> span = stackalloc char[20]; // max length of longest formatted long with invariant culture
+ message.TryFormat(span, out int charsWritten, format: default, provider: CultureInfo.InvariantCulture);
+ Debug.Assert(charsWritten > 0);
+ writer.Write(span.Slice(0, charsWritten));
+ }
+ }
+
+ private void InternalWrite(Guid message)
+ {
+ EnsureWriter();
+ if (_writer is TextWriter writer)
+ {
+ Span<char> span = stackalloc char[38]; // length of a Guid formatted as "B"
+ message.TryFormat(span, out int charsWritten, format: "B");
+ Debug.Assert(charsWritten == span.Length);
+ writer.Write(span);
+ }
+ }
+
+ private void InternalWrite(DateTime message)
+ {
+ EnsureWriter();
+ if (_writer is TextWriter writer)
+ {
+ Span<char> span = stackalloc char[33]; // max length of a DateTime formatted as "o"
+ message.TryFormat(span, out int charsWritten, format: "o");
+ Debug.Assert(charsWritten > 0);
+ writer.Write(span.Slice(0, charsWritten));
+ }
+ }
+
+ private void InternalWrite(StringBuilder message)
+ {
+ EnsureWriter();
+ if (_writer is TextWriter writer)
+ {
+ foreach (ReadOnlyMemory<char> chunk in message.GetChunks())
+ {
+ writer.Write(chunk.Span);
+ }
+ }
+ }
}
}