Skip to content

Commit 202cef0

Browse files
[release/5.0-rc2] Make EventPipeProviderCallbackData own the filter data (#42368)
Co-authored-by: David Mason <davmason@microsoft.com>
1 parent 90b5a02 commit 202cef0

6 files changed

Lines changed: 138 additions & 30 deletions

File tree

src/coreclr/src/vm/eventpipe.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,9 +1041,9 @@ HANDLE EventPipe::GetWaitHandle(EventPipeSessionID sessionID)
10411041
return pSession ? pSession->GetWaitEvent()->GetHandleUNHOSTED() : 0;
10421042
}
10431043

1044-
void EventPipe::InvokeCallback(EventPipeProviderCallbackData eventPipeProviderCallbackData)
1044+
void EventPipe::InvokeCallback(EventPipeProviderCallbackData *pEventPipeProviderCallbackData)
10451045
{
1046-
EventPipeProvider::InvokeCallback(eventPipeProviderCallbackData);
1046+
EventPipeProvider::InvokeCallback(pEventPipeProviderCallbackData);
10471047
}
10481048

10491049
EventPipeEventInstance *EventPipe::BuildEventMetadataEvent(EventPipeEventInstance &instance, unsigned int metadataId)

src/coreclr/src/vm/eventpipe.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ class EventPipe
139139
}
140140

141141
while (eventPipeProviderCallbackDataQueue.TryDequeue(&eventPipeProviderCallbackData))
142-
InvokeCallback(eventPipeProviderCallbackData);
142+
InvokeCallback(&eventPipeProviderCallbackData);
143143
}
144144

145145
// Returns the a number 0...N representing the processor number this thread is currently
@@ -158,7 +158,7 @@ class EventPipe
158158
}
159159

160160
private:
161-
static void InvokeCallback(EventPipeProviderCallbackData eventPipeProviderCallbackData);
161+
static void InvokeCallback(EventPipeProviderCallbackData *pEventPipeProviderCallbackData);
162162

163163
// Get the event used to write metadata to the event stream.
164164
static EventPipeEventInstance *BuildEventMetadataEvent(EventPipeEventInstance &instance, unsigned int metadataId);

src/coreclr/src/vm/eventpipecommontypes.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88

99
void EventPipeProviderCallbackDataQueue::Enqueue(EventPipeProviderCallbackData *pEventPipeProviderCallbackData)
1010
{
11-
SListElem<EventPipeProviderCallbackData> *listnode = new SListElem<EventPipeProviderCallbackData>(); // throws
12-
listnode->m_Value = *pEventPipeProviderCallbackData;
11+
SListElem<EventPipeProviderCallbackData> *listnode = new SListElem<EventPipeProviderCallbackData>(std::move(*pEventPipeProviderCallbackData)); // throws
1312
list.InsertTail(listnode);
1413
}
1514

@@ -19,7 +18,7 @@ bool EventPipeProviderCallbackDataQueue::TryDequeue(EventPipeProviderCallbackDat
1918
return false;
2019

2120
SListElem<EventPipeProviderCallbackData> *listnode = list.RemoveHead();
22-
*pEventPipeProviderCallbackData = listnode->m_Value;
21+
*pEventPipeProviderCallbackData = std::move(listnode->m_Value);
2322
delete listnode;
2423
return true;
2524
}

src/coreclr/src/vm/eventpipecommontypes.h

Lines changed: 117 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

111220
class EventPipeProviderCallbackDataQueue
112221
{
113222
public:
114-
void Enqueue(EventPipeProviderCallbackData* pEventPipeProviderCallbackData);
223+
void Enqueue(EventPipeProviderCallbackData *pEventPipeProviderCallbackData);
115224
bool TryDequeue(EventPipeProviderCallbackData* pEventPipeProviderCallbackData);
116225

117226
private:

src/coreclr/src/vm/eventpipeprovider.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ void EventPipeProvider::AddEvent(EventPipeEvent &event)
194194
event.RefreshState();
195195
}
196196

197-
/* static */ void EventPipeProvider::InvokeCallback(EventPipeProviderCallbackData eventPipeProviderCallbackData)
197+
/* static */ void EventPipeProvider::InvokeCallback(EventPipeProviderCallbackData *pEventPipeProviderCallbackData)
198198
{
199199
CONTRACTL
200200
{
@@ -205,12 +205,12 @@ void EventPipeProvider::AddEvent(EventPipeEvent &event)
205205
}
206206
CONTRACTL_END;
207207

208-
LPCWSTR pFilterData = eventPipeProviderCallbackData.pFilterData;
209-
EventPipeCallback pCallbackFunction = eventPipeProviderCallbackData.pCallbackFunction;
210-
bool enabled = eventPipeProviderCallbackData.enabled;
211-
INT64 keywords = eventPipeProviderCallbackData.keywords;
212-
EventPipeEventLevel providerLevel = eventPipeProviderCallbackData.providerLevel;
213-
void *pCallbackData = eventPipeProviderCallbackData.pCallbackData;
208+
LPCWSTR pFilterData = pEventPipeProviderCallbackData->GetFilterData();
209+
EventPipeCallback pCallbackFunction = pEventPipeProviderCallbackData->GetCallbackFunction();
210+
bool enabled = pEventPipeProviderCallbackData->GetEnabled();
211+
INT64 keywords = pEventPipeProviderCallbackData->GetKeywords();
212+
EventPipeEventLevel providerLevel = pEventPipeProviderCallbackData->GetProviderLevel();
213+
void *pCallbackData = pEventPipeProviderCallbackData->GetCallbackData();
214214

215215
bool isEventFilterDescriptorInitialized = false;
216216
EventFilterDescriptor eventFilterDescriptor{};
@@ -286,13 +286,13 @@ EventPipeProviderCallbackData EventPipeProvider::PrepareCallbackData(
286286
}
287287
CONTRACTL_END;
288288

289-
EventPipeProviderCallbackData result;
290-
result.pFilterData = pFilterData;
291-
result.pCallbackFunction = m_pCallbackFunction;
292-
result.enabled = (m_sessions != 0);
293-
result.providerLevel = providerLevel;
294-
result.keywords = keywords;
295-
result.pCallbackData = m_pCallbackData;
289+
EventPipeProviderCallbackData result(pFilterData,
290+
m_pCallbackFunction,
291+
(m_sessions != 0),
292+
keywords,
293+
providerLevel,
294+
m_pCallbackData,
295+
this);
296296
return result;
297297
}
298298

src/coreclr/src/vm/eventpipeprovider.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class EventPipeProvider
113113
LPCWSTR pFilterData);
114114

115115
// Invoke the provider callback.
116-
static void InvokeCallback(EventPipeProviderCallbackData eventPipeProviderCallbackData);
116+
static void InvokeCallback(EventPipeProviderCallbackData *pEventPipeProviderCallbackData);
117117

118118
// Specifies whether or not the provider was deleted, but that deletion
119119
// was deferred until after tracing is stopped.

0 commit comments

Comments
 (0)