4
4
5
5
using System . Diagnostics . CodeAnalysis ;
6
6
using System . Diagnostics . Tracing ;
7
+ using System . Runtime . CompilerServices ;
7
8
8
9
namespace Ultra . Sampler ;
9
10
10
- [ EventSource ( Name = UltraSamplerParser . Name , Guid = UltraSamplerParser . IdAsString ) ]
11
+ [ EventSource ( Name = UltraSamplerConstants . Name , Guid = UltraSamplerConstants . IdAsString ) ]
11
12
internal sealed class UltraSamplerSource : EventSource
12
13
{
13
14
public static readonly UltraSamplerSource Log = new ( ) ;
@@ -16,39 +17,47 @@ private UltraSamplerSource()
16
17
{
17
18
}
18
19
19
- [ Event ( UltraSamplerParser . NativeCallStackEvent , Level = EventLevel . Informational ) ]
20
+ [ Event ( UltraSamplerConstants . NativeCallStackEvent , Level = EventLevel . Informational ) ]
20
21
[ UnconditionalSuppressMessage ( "Trimming" , "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code" , Justification = "<Pending>" ) ]
21
- public unsafe void OnNativeCallstack ( ulong threadId , ulong pFrames , int count )
22
+ public unsafe void OnNativeCallstack ( ulong threadId , int frameCount , ulong frames ) // frames is last to allow perfview to visualize previous fixed size arguments and also, it is an ulong otherwise the EventSource will silently fail to register!
22
23
{
23
- EventData3 evt = default ;
24
- evt . Data1 . DataPointer = ( nint ) ( void * ) & threadId ;
25
- evt . Data1 . Size = sizeof ( ulong ) ;
26
- evt . Data2 . DataPointer = ( nint ) pFrames ;
27
- evt . Data2 . Size = count * sizeof ( ulong ) ;
28
- evt . Data3 . DataPointer = ( int ) & count ;
29
- evt . Data3 . Size = sizeof ( int ) ;
30
- WriteEventCore ( UltraSamplerParser . NativeCallStackEvent , 3 , & evt . Data1 ) ;
24
+ var evt = stackalloc EventData [ 3 ] ;
25
+ evt [ 0 ] . DataPointer = ( nint ) ( void * ) & threadId ;
26
+ evt [ 0 ] . Size = sizeof ( ulong ) ;
27
+ evt [ 1 ] . DataPointer = ( int ) & frameCount ;
28
+ evt [ 1 ] . Size = sizeof ( int ) ;
29
+ evt [ 2 ] . DataPointer = ( nint ) frames ;
30
+ evt [ 2 ] . Size = frameCount * sizeof ( ulong ) ;
31
+ WriteEventCore ( UltraSamplerConstants . NativeCallStackEvent , 3 , evt ) ;
31
32
}
32
33
33
- [ Event ( UltraSamplerParser . NativeModuleEvent , Level = EventLevel . Informational ) ]
34
+ [ Event ( UltraSamplerConstants . NativeModuleEvent , Level = EventLevel . Informational ) ]
34
35
[ UnconditionalSuppressMessage ( "Trimming" , "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code" , Justification = "<Pending>" ) ]
35
- public unsafe void OnNativeModuleEvent ( int nativeModuleEventKind , ulong loadAddress , ulong size , byte [ ] ? modulePathUtf8 , DateTime timestampUtc )
36
+ [ SkipLocalsInit ]
37
+ public unsafe void OnNativeModuleEvent ( int nativeModuleEventKind , ulong loadAddress , ulong size , DateTime timestampUtc , int modulePathUtf8Length , byte [ ] ? modulePathUtf8 ) // byte[] is last to allow perfview to visualize previous fixed size arguments
36
38
{
37
- EventData5 evt = default ;
38
- evt . Data1 . DataPointer = ( nint ) ( void * ) & nativeModuleEventKind ;
39
- evt . Data1 . Size = sizeof ( int ) ;
40
- evt . Data2 . DataPointer = ( nint ) ( void * ) & loadAddress ;
41
- evt . Data2 . Size = sizeof ( ulong ) ;
42
- evt . Data3 . DataPointer = ( nint ) ( void * ) & size ;
43
- evt . Data3 . Size = sizeof ( ulong ) ;
39
+ var evt = stackalloc EventData [ 6 ] ;
40
+ evt [ 0 ] . DataPointer = ( nint ) ( void * ) & nativeModuleEventKind ;
41
+ evt [ 0 ] . Size = sizeof ( int ) ;
42
+ evt [ 1 ] . DataPointer = ( nint ) ( void * ) & loadAddress ;
43
+ evt [ 1 ] . Size = sizeof ( ulong ) ;
44
+ evt [ 2 ] . DataPointer = ( nint ) ( void * ) & size ;
45
+ evt [ 2 ] . Size = sizeof ( ulong ) ;
46
+ var utcFileTime = timestampUtc . ToFileTimeUtc ( ) ;
47
+ evt [ 3 ] . DataPointer = ( nint ) ( void * ) & utcFileTime ;
48
+ evt [ 3 ] . Size = sizeof ( long ) ;
44
49
fixed ( byte * evtPathPtr = modulePathUtf8 )
45
50
{
46
- evt . Data4 . DataPointer = ( nint ) evtPathPtr ;
47
- evt . Data4 . Size = modulePathUtf8 ? . Length ?? 0 ;
48
- var utcFileTime = timestampUtc . ToFileTimeUtc ( ) ;
49
- evt . Data5 . DataPointer = ( nint ) ( void * ) & utcFileTime ;
50
- evt . Data5 . Size = sizeof ( long ) ;
51
- WriteEventCore ( UltraSamplerParser . NativeModuleEvent , 5 , & evt . Data1 ) ;
51
+ evt [ 4 ] . DataPointer = ( nint ) ( void * ) & modulePathUtf8Length ;
52
+ evt [ 4 ] . Size = sizeof ( int ) ;
53
+
54
+ if ( modulePathUtf8Length > 0 )
55
+ {
56
+ evt [ 5 ] . DataPointer = ( nint ) evtPathPtr ;
57
+ evt [ 5 ] . Size = modulePathUtf8Length ;
58
+ }
59
+
60
+ WriteEventCore ( UltraSamplerConstants . NativeModuleEvent , modulePathUtf8Length > 0 ? 5 : 4 , evt ) ;
52
61
}
53
62
}
54
63
@@ -67,26 +76,4 @@ protected override void OnEventCommand(EventCommandEventArgs command)
67
76
Thread . Sleep ( 100 ) ;
68
77
}
69
78
}
70
-
71
- private struct EventData3
72
- {
73
- public EventData Data1 ;
74
-
75
- public EventData Data2 ;
76
-
77
- public EventData Data3 ;
78
- }
79
-
80
- private struct EventData5
81
- {
82
- public EventData Data1 ;
83
-
84
- public EventData Data2 ;
85
-
86
- public EventData Data3 ;
87
-
88
- public EventData Data4 ;
89
-
90
- public EventData Data5 ;
91
- }
92
79
}
0 commit comments