#endif // _DEBUG
}
+EventPipeBufferManager::~EventPipeBufferManager()
+{
+ CONTRACTL
+ {
+ THROWS;
+ GC_TRIGGERS;
+ MODE_ANY;
+ }
+ CONTRACTL_END;
+
+ if(m_pPerThreadBufferList != NULL)
+ {
+ SListElem<EventPipeBufferList*> *pElem = m_pPerThreadBufferList->GetHead();
+ while(pElem != NULL)
+ {
+ SListElem<EventPipeBufferList*> *pCurElem = pElem;
+
+ EventPipeBufferList *pThreadBufferList = pCurElem->GetValue();
+ if (!pThreadBufferList->OwnedByThread())
+ {
+ Thread *pThread = NULL;
+ while ((pThread = ThreadStore::GetThreadList(pThread)) != NULL)
+ {
+ if (pThread->GetEventPipeBufferList() == pThreadBufferList)
+ {
+ pThread->SetEventPipeBufferList(NULL);
+ break;
+ }
+ }
+
+ // We don't delete buffers themself because they can be in-use
+ delete(pThreadBufferList);
+ }
+
+ pElem = m_pPerThreadBufferList->GetNext(pElem);
+ delete(pCurElem);
+ }
+
+ delete(m_pPerThreadBufferList);
+ m_pPerThreadBufferList = NULL;
+ }
+}
+
EventPipeBuffer* EventPipeBufferManager::AllocateBufferForThread(Thread *pThread, unsigned int requestSize)
{
CONTRACTL
// In DEBUG, make sure that the element was found and removed.
_ASSERTE(pElem != NULL);
+
+ SListElem<EventPipeBufferList*> *pCurElem = pElem;
+ pElem = m_pPerThreadBufferList->GetNext(pElem);
+ delete(pCurElem);
+ }
+ else
+ {
+ pElem = m_pPerThreadBufferList->GetNext(pElem);
}
- pElem = m_pPerThreadBufferList->GetNext(pElem);
}
// Remove the list reference from the thread.
pElem = m_pPerThreadBufferList->FindAndRemove(pElem);
_ASSERTE(pElem != NULL);
+ SListElem<EventPipeBufferList*> *pCurElem = pElem;
+ pElem = m_pPerThreadBufferList->GetNext(pElem);
+ delete(pCurElem);
+
// Now that all of the list elements have been freed, free the list itself.
delete(pBufferList);
pBufferList = NULL;
}
-
- pElem = m_pPerThreadBufferList->GetNext(pElem);
+ else
+ {
+ pElem = m_pPerThreadBufferList->GetNext(pElem);
+ }
}
}
}
CONTRACTL_END;
+ if(m_pConfigProvider != NULL)
+ {
+ delete(m_pConfigProvider);
+ m_pConfigProvider = NULL;
+ }
+
if(m_pEnabledProviderList != NULL)
{
delete(m_pEnabledProviderList);
if(m_pProviderList != NULL)
{
+ SListElem<EventPipeProvider*> *pElem = m_pProviderList->GetHead();
+ while(pElem != NULL)
+ {
+ // We don't delete provider itself because it can be in-use
+ SListElem<EventPipeProvider*> *pCurElem = pElem;
+ pElem = m_pProviderList->GetNext(pElem);
+ delete(pCurElem);
+ }
+
delete(m_pProviderList);
m_pProviderList = NULL;
}
{
if(m_pProviderList->FindAndRemove(pElem) != NULL)
{
+ delete(pElem);
return true;
}
}
{
// The act of deleting the provider unregisters it and removes it from the list.
delete(pProvider);
+ SListElem<EventPipeProvider*> *pCurElem = pElem;
+ pElem = m_pProviderList->GetNext(pElem);
+ delete(pCurElem);
+ }
+ else
+ {
+ pElem = m_pProviderList->GetNext(pElem);
}
-
- pElem = m_pProviderList->GetNext(pElem);
}
}