summaryrefslogtreecommitdiff
path: root/src/vm/eventpipeprovider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/eventpipeprovider.cpp')
-rw-r--r--src/vm/eventpipeprovider.cpp36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/vm/eventpipeprovider.cpp b/src/vm/eventpipeprovider.cpp
index c10dd33638..84a90e4abb 100644
--- a/src/vm/eventpipeprovider.cpp
+++ b/src/vm/eventpipeprovider.cpp
@@ -24,6 +24,7 @@ EventPipeProvider::EventPipeProvider(EventPipeConfiguration *pConfig, const SStr
m_providerName = providerName;
m_enabled = false;
+ m_deleteDeferred = false;
m_keywords = 0;
m_providerLevel = EventPipeEventLevel::Critical;
m_pEventList = new SList<SListElem<EventPipeEvent*>>();
@@ -36,8 +37,8 @@ EventPipeProvider::~EventPipeProvider()
{
CONTRACTL
{
- THROWS;
- GC_NOTRIGGER;
+ NOTHROW;
+ GC_TRIGGERS;
MODE_ANY;
}
CONTRACTL_END;
@@ -45,21 +46,30 @@ EventPipeProvider::~EventPipeProvider()
// Free all of the events.
if(m_pEventList != NULL)
{
- // Take the lock before manipulating the list.
- CrstHolder _crst(EventPipe::GetLock());
-
- SListElem<EventPipeEvent*> *pElem = m_pEventList->GetHead();
- while(pElem != NULL)
+ // We swallow exceptions here because the HOST_BREAKABLE
+ // lock may throw and this destructor gets called in throw
+ // intolerant places. If that happens the event list will leak
+ EX_TRY
{
- EventPipeEvent *pEvent = pElem->GetValue();
- delete pEvent;
+ // Take the lock before manipulating the list.
+ CrstHolder _crst(EventPipe::GetLock());
+
+ SListElem<EventPipeEvent*> *pElem = m_pEventList->GetHead();
+ while(pElem != NULL)
+ {
+ EventPipeEvent *pEvent = pElem->GetValue();
+ delete pEvent;
+
+ SListElem<EventPipeEvent*> *pCurElem = pElem;
+ pElem = m_pEventList->GetNext(pElem);
+ delete pCurElem;
+ }
- SListElem<EventPipeEvent*> *pCurElem = pElem;
- pElem = m_pEventList->GetNext(pElem);
- delete pCurElem;
+ delete m_pEventList;
}
+ EX_CATCH { }
+ EX_END_CATCH(SwallowAllExceptions);
- delete m_pEventList;
m_pEventList = NULL;
}
}