From d0916fbd87cae1da7598ce583dfe2dfeb2b67782 Mon Sep 17 00:00:00 2001 From: John Salem Date: Thu, 21 Apr 2022 14:57:44 -0700 Subject: [PATCH] Fix in-process decoding of DateTime in EventSource (#67557) --- .../System/Diagnostics/Tracing/EventSource.cs | 2 +- .../tracing/eventlistener/EventListener.cs | 27 +++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs index c7409694498..5ef96703d8c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs @@ -1841,7 +1841,7 @@ private static unsafe void DecodeObjects(object?[] decodedObjects, Type[] parame } else if (typeCode == TypeCode.DateTime) { - decoded = *(DateTime*)dataPointer; + decoded = DateTime.FromFileTimeUtc(*(long*)dataPointer); } else if (IntPtr.Size == 8 && dataType == typeof(IntPtr)) { diff --git a/src/tests/tracing/eventlistener/EventListener.cs b/src/tests/tracing/eventlistener/EventListener.cs index 23a1ff37d13..0cd7e18459c 100644 --- a/src/tests/tracing/eventlistener/EventListener.cs +++ b/src/tests/tracing/eventlistener/EventListener.cs @@ -15,6 +15,20 @@ class SimpleEventSource : EventSource [Event(1)] internal void MathResult(int x, int y, int z, string formula) { this.WriteEvent(1, x, y, z, formula); } + + [Event(2)] + internal void DateTimeEvent(DateTime dateTime) => WriteEvent(2, dateTime); + + + [NonEvent] + private unsafe void WriteEvent(int eventId, DateTime dateTime) + { + EventData* desc = stackalloc EventData[1]; + long fileTime = dateTime.ToFileTimeUtc(); + desc[0].DataPointer = (IntPtr)(&fileTime); + desc[0].Size = 8; + WriteEventCore(eventId, 1, desc); + } } internal sealed class SimpleEventListener : EventListener @@ -23,6 +37,7 @@ internal sealed class SimpleEventListener : EventListener private readonly EventLevel _level; public int EventCount { get; private set; } = 0; + public DateTime DateObserved { get; private set; } = DateTime.MinValue; public SimpleEventListener(string targetSourceName, EventLevel level) { @@ -41,13 +56,19 @@ protected override void OnEventSourceCreated(EventSource source) protected override void OnEventWritten(EventWrittenEventArgs eventData) { - EventCount++; + if (eventData.EventId == 2) + { + DateObserved = (DateTime)eventData.Payload[0]; + } + else + EventCount++; } } class EventPipeSmoke { private static int messageIterations = 100; + private static readonly DateTime ThePast = DateTime.UtcNow; static int Main(string[] args) { @@ -68,10 +89,12 @@ static int Main(string[] args) eventSource.MathResult(x, y, x+y, formula); } + eventSource.DateTimeEvent(ThePast); Console.WriteLine("\tEnd: Messaging.\n"); Console.WriteLine($"\tEventListener received {listener.EventCount} event(s)\n"); - pass = listener.EventCount == messageIterations; + Console.WriteLine($"\tEventListener received {listener.DateObserved} vs {ThePast}\n"); + pass = listener.EventCount == messageIterations && ThePast == listener.DateObserved; } return pass ? 100 : -1; -- GitLab