1 | // The .NET Foundation licenses this file to you under the MIT license. |
2 | // See the LICENSE file in the project root for more information. |
3 | |
4 | #ifndef __EVENTPIPE_CONFIGURATION_H__ |
5 | #define __EVENTPIPE_CONFIGURATION_H__ |
6 | |
7 | #ifdef FEATURE_PERFTRACING |
8 | |
9 | #include "eventpipe.h" |
10 | #include "slist.h" |
11 | |
12 | class EventPipeSessionProvider; |
13 | class EventPipeEvent; |
14 | class EventPipeEventInstance; |
15 | class EventPipeProvider; |
16 | struct EventPipeProviderConfiguration; |
17 | class EventPipeSession; |
18 | enum class EventPipeSessionType; |
19 | class EventPipeSessionProvider; |
20 | |
21 | enum class EventPipeEventLevel |
22 | { |
23 | LogAlways, |
24 | Critical, |
25 | Error, |
26 | Warning, |
27 | Informational, |
28 | Verbose |
29 | }; |
30 | |
31 | class EventPipeConfiguration |
32 | { |
33 | public: |
34 | |
35 | EventPipeConfiguration(); |
36 | ~EventPipeConfiguration(); |
37 | |
38 | // Perform initialization that cannot be performed in the constructor. |
39 | void Initialize(); |
40 | |
41 | // Create a new provider. |
42 | EventPipeProvider* CreateProvider(const SString &providerName, EventPipeCallback pCallbackFunction, void *pCallbackData); |
43 | |
44 | // Delete a provider. |
45 | void DeleteProvider(EventPipeProvider *pProvider); |
46 | |
47 | // Register a provider. |
48 | bool RegisterProvider(EventPipeProvider &provider); |
49 | |
50 | // Unregister a provider. |
51 | bool UnregisterProvider(EventPipeProvider &provider); |
52 | |
53 | // Get the provider with the specified provider ID if it exists. |
54 | EventPipeProvider* GetProvider(const SString &providerID); |
55 | |
56 | // Create a new session. |
57 | EventPipeSession* CreateSession(EventPipeSessionType sessionType, unsigned int circularBufferSizeInMB, EventPipeProviderConfiguration *pProviders, unsigned int numProviders, UINT64 multiFileTraceLengthInSeconds = 0); |
58 | |
59 | // Delete a session. |
60 | void DeleteSession(EventPipeSession *pSession); |
61 | |
62 | // Get the configured size of the circular buffer. |
63 | size_t GetCircularBufferSize() const; |
64 | |
65 | // Enable a session in the event pipe. |
66 | void Enable(EventPipeSession *pSession); |
67 | |
68 | // Disable a session in the event pipe. |
69 | void Disable(EventPipeSession *pSession); |
70 | |
71 | // Get the status of the event pipe. |
72 | bool Enabled() const; |
73 | |
74 | // Determine if rundown is enabled. |
75 | bool RundownEnabled() const; |
76 | |
77 | // Enable rundown using the specified configuration. |
78 | void EnableRundown(EventPipeSession *pSession); |
79 | |
80 | // Get the event used to write metadata to the event stream. |
81 | EventPipeEventInstance* BuildEventMetadataEvent(EventPipeEventInstance &sourceInstance, unsigned int metdataId); |
82 | |
83 | // Delete deferred providers. |
84 | void DeleteDeferredProviders(); |
85 | |
86 | // Determine if the specified thread is the rundown thread. |
87 | // Used during rundown to ignore events from all other threads so that we don't corrupt the trace file. |
88 | inline bool IsRundownThread(Thread *pThread) |
89 | { |
90 | LIMITED_METHOD_CONTRACT; |
91 | |
92 | return (pThread == m_pRundownThread); |
93 | } |
94 | |
95 | private: |
96 | |
97 | // Get the provider without taking the lock. |
98 | EventPipeProvider* GetProviderNoLock(const SString &providerID); |
99 | |
100 | // Get the enabled provider. |
101 | EventPipeSessionProvider* GetSessionProvider(EventPipeSession *pSession, EventPipeProvider *pProvider); |
102 | |
103 | // The one and only EventPipe session. |
104 | EventPipeSession *m_pSession; |
105 | |
106 | // Determines whether or not the event pipe is enabled. |
107 | Volatile<bool> m_enabled; |
108 | |
109 | // The list of event pipe providers. |
110 | SList<SListElem<EventPipeProvider*>> *m_pProviderList; |
111 | |
112 | // The provider used to write configuration events to the event stream. |
113 | EventPipeProvider *m_pConfigProvider; |
114 | |
115 | // The event used to write event information to the event stream. |
116 | EventPipeEvent *m_pMetadataEvent; |
117 | |
118 | // The provider name for the configuration event pipe provider. |
119 | // This provider is used to emit configuration events. |
120 | const static WCHAR* s_configurationProviderName; |
121 | |
122 | // True if rundown is enabled. |
123 | Volatile<bool> m_rundownEnabled; |
124 | |
125 | // The rundown thread. If rundown is not enabled, this is NULL. |
126 | Thread *m_pRundownThread; |
127 | }; |
128 | |
129 | #endif // FEATURE_PERFTRACING |
130 | |
131 | #endif // __EVENTPIPE_CONFIGURATION_H__ |
132 | |