@@ -98,20 +98,129 @@ typedef void (*EventPipeCallback)(
9898 EventFilterDescriptor *FilterData,
9999 void *CallbackContext);
100100
101- struct EventPipeProviderCallbackData
101+ class EventPipeProviderCallbackData
102102{
103- LPCWSTR pFilterData;
104- EventPipeCallback pCallbackFunction;
105- bool enabled;
106- INT64 keywords;
107- EventPipeEventLevel providerLevel;
108- void * pCallbackData;
103+ public:
104+ EventPipeProviderCallbackData ():
105+ m_pFilterData (nullptr ),
106+ m_pCallbackFunction (nullptr ),
107+ m_enabled (false ),
108+ m_keywords (0 ),
109+ m_providerLevel (EventPipeEventLevel::LogAlways),
110+ m_pCallbackData (nullptr ),
111+ m_pProvider (nullptr )
112+ {
113+
114+ }
115+
116+ EventPipeProviderCallbackData (LPCWSTR pFilterData,
117+ EventPipeCallback pCallbackFunction,
118+ bool enabled,
119+ INT64 keywords,
120+ EventPipeEventLevel providerLevel,
121+ void * pCallbackData,
122+ EventPipeProvider *pProvider) :
123+ m_pFilterData (nullptr ),
124+ m_pCallbackFunction (pCallbackFunction),
125+ m_enabled (enabled),
126+ m_keywords (keywords),
127+ m_providerLevel (providerLevel),
128+ m_pCallbackData (pCallbackData),
129+ m_pProvider (pProvider)
130+ {
131+ if (pFilterData != nullptr )
132+ {
133+ // This is the only way to create an EventPipeProviderCallbackData that will copy the
134+ // filter data. The copying is intentional, because sessions die before callbacks happen
135+ // so we cannot cache a pointer to the session's filter data.
136+ size_t bufSize = wcslen (pFilterData) + 1 ;
137+ m_pFilterData = new WCHAR[bufSize];
138+ wcscpy_s (m_pFilterData, bufSize, pFilterData);
139+ }
140+ }
141+
142+ EventPipeProviderCallbackData (EventPipeProviderCallbackData &&other)
143+ : EventPipeProviderCallbackData()
144+ {
145+ *this = std::move (other);
146+ }
147+
148+ EventPipeProviderCallbackData &operator =(EventPipeProviderCallbackData &&other)
149+ {
150+ std::swap (m_pFilterData, other.m_pFilterData );
151+ m_pCallbackFunction = other.m_pCallbackFunction ;
152+ m_enabled = other.m_enabled ;
153+ m_keywords = other.m_keywords ;
154+ m_providerLevel = other.m_providerLevel ;
155+ m_pCallbackData = other.m_pCallbackData ;
156+ m_pProvider = other.m_pProvider ;
157+
158+ return *this ;
159+ }
160+
161+ // We don't want to be unintentionally copying and deleting the filter data any more
162+ // than we have to. Moving (above) is fine, but copying should be avoided.
163+ EventPipeProviderCallbackData (const EventPipeProviderCallbackData &other) = delete ;
164+ EventPipeProviderCallbackData &operator =(const EventPipeProviderCallbackData &other) = delete ;
165+
166+ ~EventPipeProviderCallbackData ()
167+ {
168+ if (m_pFilterData != nullptr )
169+ {
170+ delete[] m_pFilterData;
171+ m_pFilterData = nullptr ;
172+ }
173+ }
174+
175+ LPCWSTR GetFilterData () const
176+ {
177+ return m_pFilterData;
178+ }
179+
180+ EventPipeCallback GetCallbackFunction () const
181+ {
182+ return m_pCallbackFunction;
183+ }
184+
185+ bool GetEnabled () const
186+ {
187+ return m_enabled;
188+ }
189+
190+ INT64 GetKeywords () const
191+ {
192+ return m_keywords;
193+ }
194+
195+ EventPipeEventLevel GetProviderLevel () const
196+ {
197+ return m_providerLevel;
198+ }
199+
200+ void *GetCallbackData () const
201+ {
202+ return m_pCallbackData;
203+ }
204+
205+ EventPipeProvider *GetProvider () const
206+ {
207+ return m_pProvider;
208+ }
209+
210+ private:
211+ WCHAR *m_pFilterData;
212+ EventPipeCallback m_pCallbackFunction;
213+ bool m_enabled;
214+ INT64 m_keywords;
215+ EventPipeEventLevel m_providerLevel;
216+ void * m_pCallbackData;
217+ EventPipeProvider *m_pProvider;
109218};
110219
111220class EventPipeProviderCallbackDataQueue
112221{
113222public:
114- void Enqueue (EventPipeProviderCallbackData* pEventPipeProviderCallbackData);
223+ void Enqueue (EventPipeProviderCallbackData * pEventPipeProviderCallbackData);
115224 bool TryDequeue (EventPipeProviderCallbackData* pEventPipeProviderCallbackData);
116225
117226private:
0 commit comments