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 f8d6e9c6ff114d..cdaa7eea9c1935 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 @@ -1839,7 +1839,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 23a1ff37d131b7..0cd7e18459cb82 100644 --- a/src/tests/tracing/eventlistener/EventListener.cs +++ b/src/tests/tracing/eventlistener/EventListener.cs @@ -15,6 +15,20 @@ public SimpleEventSource() : base(true) { } [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;