Skip to content

Commit d0916fb

Browse files
author
John Salem
authored
Fix in-process decoding of DateTime in EventSource (#67557)
1 parent f00615c commit d0916fb

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1841,7 +1841,7 @@ private static unsafe void DecodeObjects(object?[] decodedObjects, Type[] parame
18411841
}
18421842
else if (typeCode == TypeCode.DateTime)
18431843
{
1844-
decoded = *(DateTime*)dataPointer;
1844+
decoded = DateTime.FromFileTimeUtc(*(long*)dataPointer);
18451845
}
18461846
else if (IntPtr.Size == 8 && dataType == typeof(IntPtr))
18471847
{

src/tests/tracing/eventlistener/EventListener.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,20 @@ public SimpleEventSource() : base(true) { }
1515

1616
[Event(1)]
1717
internal void MathResult(int x, int y, int z, string formula) { this.WriteEvent(1, x, y, z, formula); }
18+
19+
[Event(2)]
20+
internal void DateTimeEvent(DateTime dateTime) => WriteEvent(2, dateTime);
21+
22+
23+
[NonEvent]
24+
private unsafe void WriteEvent(int eventId, DateTime dateTime)
25+
{
26+
EventData* desc = stackalloc EventData[1];
27+
long fileTime = dateTime.ToFileTimeUtc();
28+
desc[0].DataPointer = (IntPtr)(&fileTime);
29+
desc[0].Size = 8;
30+
WriteEventCore(eventId, 1, desc);
31+
}
1832
}
1933

2034
internal sealed class SimpleEventListener : EventListener
@@ -23,6 +37,7 @@ internal sealed class SimpleEventListener : EventListener
2337
private readonly EventLevel _level;
2438

2539
public int EventCount { get; private set; } = 0;
40+
public DateTime DateObserved { get; private set; } = DateTime.MinValue;
2641

2742
public SimpleEventListener(string targetSourceName, EventLevel level)
2843
{
@@ -41,13 +56,19 @@ protected override void OnEventSourceCreated(EventSource source)
4156

4257
protected override void OnEventWritten(EventWrittenEventArgs eventData)
4358
{
44-
EventCount++;
59+
if (eventData.EventId == 2)
60+
{
61+
DateObserved = (DateTime)eventData.Payload[0];
62+
}
63+
else
64+
EventCount++;
4565
}
4666
}
4767

4868
class EventPipeSmoke
4969
{
5070
private static int messageIterations = 100;
71+
private static readonly DateTime ThePast = DateTime.UtcNow;
5172

5273
static int Main(string[] args)
5374
{
@@ -68,10 +89,12 @@ static int Main(string[] args)
6889

6990
eventSource.MathResult(x, y, x+y, formula);
7091
}
92+
eventSource.DateTimeEvent(ThePast);
7193
Console.WriteLine("\tEnd: Messaging.\n");
7294

7395
Console.WriteLine($"\tEventListener received {listener.EventCount} event(s)\n");
74-
pass = listener.EventCount == messageIterations;
96+
Console.WriteLine($"\tEventListener received {listener.DateObserved} vs {ThePast}\n");
97+
pass = listener.EventCount == messageIterations && ThePast == listener.DateObserved;
7598
}
7699

77100
return pass ? 100 : -1;

0 commit comments

Comments
 (0)