@@ -218,6 +218,10 @@ void EventPipe::Disable()
218218
219219 // De-allocate buffers.
220220 s_pBufferManager->DeAllocateBuffers ();
221+
222+ // Delete deferred providers.
223+ // Providers can't be deleted during tracing because they may be needed when serializing the file.
224+ s_pConfig->DeleteDeferredProviders ();
221225 }
222226}
223227
@@ -234,6 +238,50 @@ bool EventPipe::Enabled()
234238 return enabled;
235239}
236240
241+ EventPipeProvider* EventPipe::CreateProvider (const GUID &providerID, EventPipeCallback pCallbackFunction, void *pCallbackData)
242+ {
243+ CONTRACTL
244+ {
245+ THROWS;
246+ GC_TRIGGERS;
247+ MODE_ANY;
248+ }
249+ CONTRACTL_END;
250+
251+ return new EventPipeProvider (providerID, pCallbackFunction, pCallbackData);
252+ }
253+
254+ void EventPipe::DeleteProvider (EventPipeProvider *pProvider)
255+ {
256+ CONTRACTL
257+ {
258+ THROWS;
259+ GC_TRIGGERS;
260+ MODE_ANY;
261+ }
262+ CONTRACTL_END;
263+
264+ // Take the lock to make sure that we don't have a race
265+ // between disabling tracing and deleting a provider
266+ // where we hold a provider after tracing has been disabled.
267+ CrstHolder _crst (GetLock ());
268+
269+ if (pProvider != NULL )
270+ {
271+ if (Enabled ())
272+ {
273+ // Save the provider until the end of the tracing session.
274+ pProvider->SetDeleteDeferred ();
275+ }
276+ else
277+ {
278+ // Delete the provider now.
279+ // NOTE: This will remove it from all of the EventPipe data structures.
280+ delete (pProvider);
281+ }
282+ }
283+ }
284+
237285void EventPipe::WriteEvent (EventPipeEvent &event, BYTE *pData, unsigned int length)
238286{
239287 CONTRACTL
@@ -477,7 +525,7 @@ INT_PTR QCALLTYPE EventPipeInternal::CreateProvider(
477525
478526 BEGIN_QCALL;
479527
480- pProvider = new EventPipeProvider (providerID, pCallbackFunc, NULL );
528+ pProvider = EventPipe::CreateProvider (providerID, pCallbackFunc, NULL );
481529
482530 END_QCALL;
483531
@@ -519,7 +567,7 @@ void QCALLTYPE EventPipeInternal::DeleteProvider(
519567 if (provHandle != NULL )
520568 {
521569 EventPipeProvider *pProvider = reinterpret_cast <EventPipeProvider*>(provHandle);
522- delete pProvider;
570+ EventPipe::DeleteProvider ( pProvider) ;
523571 }
524572
525573 END_QCALL;
0 commit comments