Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit bb01fb0

Browse files
committed
Merge in 'release/2.0.0' changes
2 parents 5867b65 + 7f14336 commit bb01fb0

File tree

6 files changed

+78
-28
lines changed

6 files changed

+78
-28
lines changed

src/vm/eventpipe.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,13 @@ EventPipeProvider* EventPipe::CreateProvider(const GUID &providerID, EventPipeCa
248248
}
249249
CONTRACTL_END;
250250

251-
return new EventPipeProvider(providerID, pCallbackFunction, pCallbackData);
251+
EventPipeProvider *pProvider = NULL;
252+
if (s_pConfig != NULL)
253+
{
254+
pProvider = s_pConfig->CreateProvider(providerID, pCallbackFunction, pCallbackData);
255+
}
256+
257+
return pProvider;
252258
}
253259

254260
void EventPipe::DeleteProvider(EventPipeProvider *pProvider)
@@ -276,8 +282,10 @@ void EventPipe::DeleteProvider(EventPipeProvider *pProvider)
276282
else
277283
{
278284
// Delete the provider now.
279-
// NOTE: This will remove it from all of the EventPipe data structures.
280-
delete(pProvider);
285+
if (s_pConfig != NULL)
286+
{
287+
s_pConfig->DeleteProvider(pProvider);
288+
}
281289
}
282290
}
283291
}

src/vm/eventpipeconfiguration.cpp

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ EventPipeConfiguration::~EventPipeConfiguration()
3434
MODE_ANY;
3535
}
3636
CONTRACTL_END;
37+
38+
if(m_pConfigProvider != NULL)
39+
{
40+
DeleteProvider(m_pConfigProvider);
41+
}
3742

3843
if(m_pEnabledProviderList != NULL)
3944
{
@@ -59,7 +64,7 @@ void EventPipeConfiguration::Initialize()
5964
CONTRACTL_END;
6065

6166
// Create the configuration provider.
62-
m_pConfigProvider = EventPipe::CreateProvider(s_configurationProviderID);
67+
m_pConfigProvider = CreateProvider(s_configurationProviderID, NULL, NULL);
6368

6469
// Create the metadata event.
6570
m_pMetadataEvent = m_pConfigProvider->AddEvent(
@@ -70,6 +75,49 @@ void EventPipeConfiguration::Initialize()
7075
false); /* needStack */
7176
}
7277

78+
EventPipeProvider* EventPipeConfiguration::CreateProvider(const GUID &providerID, EventPipeCallback pCallbackFunction, void *pCallbackData)
79+
{
80+
CONTRACTL
81+
{
82+
THROWS;
83+
GC_NOTRIGGER;
84+
MODE_ANY;
85+
}
86+
CONTRACTL_END;
87+
88+
// Allocate a new provider.
89+
EventPipeProvider *pProvider = new EventPipeProvider(this, providerID, pCallbackFunction, pCallbackData);
90+
91+
// Register the provider with the configuration system.
92+
RegisterProvider(*pProvider);
93+
94+
return pProvider;
95+
}
96+
97+
void EventPipeConfiguration::DeleteProvider(EventPipeProvider *pProvider)
98+
{
99+
CONTRACTL
100+
{
101+
THROWS;
102+
GC_NOTRIGGER;
103+
MODE_ANY;
104+
PRECONDITION(pProvider != NULL);
105+
}
106+
CONTRACTL_END;
107+
108+
if (pProvider == NULL)
109+
{
110+
return;
111+
}
112+
113+
// Unregister the provider.
114+
UnregisterProvider(*pProvider);
115+
116+
// Free the provider itself.
117+
delete(pProvider);
118+
}
119+
120+
73121
bool EventPipeConfiguration::RegisterProvider(EventPipeProvider &provider)
74122
{
75123
CONTRACTL
@@ -400,8 +448,7 @@ void EventPipeConfiguration::DeleteDeferredProviders()
400448
EventPipeProvider *pProvider = pElem->GetValue();
401449
if(pProvider->GetDeleteDeferred())
402450
{
403-
// The act of deleting the provider unregisters it and removes it from the list.
404-
delete(pProvider);
451+
DeleteProvider(pProvider);
405452
}
406453

407454
pElem = m_pProviderList->GetNext(pElem);

src/vm/eventpipeconfiguration.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#ifdef FEATURE_PERFTRACING
88

9+
#include "eventpipe.h"
910
#include "slist.h"
1011

1112
class EventPipeEnabledProvider;
@@ -35,6 +36,12 @@ class EventPipeConfiguration
3536
// Perform initialization that cannot be performed in the constructor.
3637
void Initialize();
3738

39+
// Create a new provider.
40+
EventPipeProvider* CreateProvider(const GUID &providerID, EventPipeCallback pCallbackFunction, void *pCallbackData);
41+
42+
// Delete a provider.
43+
void DeleteProvider(EventPipeProvider *pProvider);
44+
3845
// Register a provider.
3946
bool RegisterProvider(EventPipeProvider &provider);
4047

src/vm/eventpipeprovider.cpp

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010

1111
#ifdef FEATURE_PERFTRACING
1212

13-
EventPipeProvider::EventPipeProvider(const GUID &providerID, EventPipeCallback pCallbackFunction, void *pCallbackData)
13+
EventPipeProvider::EventPipeProvider(EventPipeConfiguration *pConfig, const GUID &providerID, EventPipeCallback pCallbackFunction, void *pCallbackData)
1414
{
1515
CONTRACTL
1616
{
1717
THROWS;
1818
GC_NOTRIGGER;
1919
MODE_ANY;
20+
PRECONDITION(pConfig != NULL);
2021
}
2122
CONTRACTL_END;
2223

@@ -27,11 +28,7 @@ EventPipeProvider::EventPipeProvider(const GUID &providerID, EventPipeCallback p
2728
m_pEventList = new SList<SListElem<EventPipeEvent*>>();
2829
m_pCallbackFunction = pCallbackFunction;
2930
m_pCallbackData = pCallbackData;
30-
m_pConfig = EventPipe::GetConfiguration();
31-
_ASSERTE(m_pConfig != NULL);
32-
33-
// Register the provider.
34-
m_pConfig->RegisterProvider(*this);
31+
m_pConfig = pConfig;
3532
}
3633

3734
EventPipeProvider::~EventPipeProvider()
@@ -44,15 +41,6 @@ EventPipeProvider::~EventPipeProvider()
4441
}
4542
CONTRACTL_END;
4643

47-
// Unregister the provider.
48-
// This call is re-entrant.
49-
// NOTE: We don't use the cached event pipe configuration pointer
50-
// in case this runs during shutdown and the configuration has already
51-
// been freed.
52-
EventPipeConfiguration* pConfig = EventPipe::GetConfiguration();
53-
_ASSERTE(pConfig != NULL);
54-
pConfig->UnregisterProvider(*this);
55-
5644
// Free all of the events.
5745
if(m_pEventList != NULL)
5846
{

src/vm/eventpipeprovider.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class EventPipeProvider
6161
bool m_deleteDeferred;
6262

6363
// Private constructor because all providers are created through EventPipe::CreateProvider.
64-
EventPipeProvider(const GUID &providerID, EventPipeCallback pCallbackFunction = NULL, void *pCallbackData = NULL);
64+
EventPipeProvider(EventPipeConfiguration *pConfig, const GUID &providerID, EventPipeCallback pCallbackFunction = NULL, void *pCallbackData = NULL);
6565

6666
public:
6767

src/vm/threads.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -987,12 +987,6 @@ void DestroyThread(Thread *th)
987987
#endif // _TARGET_X86_
988988
#endif // WIN64EXCEPTIONS
989989

990-
if (g_fEEShutDown == 0)
991-
{
992-
th->SetThreadState(Thread::TS_ReportDead);
993-
th->OnThreadTerminate(FALSE);
994-
}
995-
996990
#ifdef FEATURE_PERFTRACING
997991
// Before the thread dies, mark its buffers as no longer owned
998992
// so that they can be cleaned up after the thread dies.
@@ -1002,6 +996,12 @@ void DestroyThread(Thread *th)
1002996
pBufferList->SetOwnedByThread(false);
1003997
}
1004998
#endif // FEATURE_PERFTRACING
999+
1000+
if (g_fEEShutDown == 0)
1001+
{
1002+
th->SetThreadState(Thread::TS_ReportDead);
1003+
th->OnThreadTerminate(FALSE);
1004+
}
10051005
}
10061006

10071007
//-------------------------------------------------------------------------

0 commit comments

Comments
 (0)