summaryrefslogtreecommitdiff
path: root/src/vm/eventpipebuffermanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/eventpipebuffermanager.cpp')
-rw-r--r--src/vm/eventpipebuffermanager.cpp42
1 files changed, 35 insertions, 7 deletions
diff --git a/src/vm/eventpipebuffermanager.cpp b/src/vm/eventpipebuffermanager.cpp
index e7d97d5732..045e1d999a 100644
--- a/src/vm/eventpipebuffermanager.cpp
+++ b/src/vm/eventpipebuffermanager.cpp
@@ -37,7 +37,7 @@ EventPipeBufferManager::~EventPipeBufferManager()
{
CONTRACTL
{
- THROWS;
+ NOTHROW;
GC_TRIGGERS;
MODE_ANY;
}
@@ -80,7 +80,7 @@ EventPipeBuffer* EventPipeBufferManager::AllocateBufferForThread(Thread *pThread
{
CONTRACTL
{
- THROWS;
+ NOTHROW;
GC_NOTRIGGER;
MODE_ANY;
PRECONDITION(pThread != NULL);
@@ -97,8 +97,19 @@ EventPipeBuffer* EventPipeBufferManager::AllocateBufferForThread(Thread *pThread
EventPipeBufferList *pThreadBufferList = pThread->GetEventPipeBufferList();
if(pThreadBufferList == NULL)
{
- pThreadBufferList = new EventPipeBufferList(this);
- m_pPerThreadBufferList->InsertTail(new SListElem<EventPipeBufferList*>(pThreadBufferList));
+ pThreadBufferList = new (nothrow) EventPipeBufferList(this);
+ if (pThreadBufferList == NULL)
+ {
+ return NULL;
+ }
+
+ SListElem<EventPipeBufferList*> *pElem = new (nothrow) SListElem<EventPipeBufferList*>(pThreadBufferList);
+ if (pElem == NULL)
+ {
+ return NULL;
+ }
+
+ m_pPerThreadBufferList->InsertTail(pElem);
pThread->SetEventPipeBufferList(pThreadBufferList);
allocateNewBuffer = true;
}
@@ -181,7 +192,24 @@ EventPipeBuffer* EventPipeBufferManager::AllocateBufferForThread(Thread *pThread
bufferSize = requestSize;
}
- pNewBuffer = new EventPipeBuffer(bufferSize);
+ // EX_TRY is used here as opposed to new (nothrow) because
+ // the constructor also allocates a private buffer, which
+ // could throw, and cannot be easily checked
+ EX_TRY
+ {
+ pNewBuffer = new EventPipeBuffer(bufferSize);
+ }
+ EX_CATCH
+ {
+ pNewBuffer = NULL;
+ }
+ EX_END_CATCH(SwallowAllExceptions);
+
+ if (pNewBuffer == NULL)
+ {
+ return NULL;
+ }
+
m_sizeOfAllBuffers += bufferSize;
#ifdef _DEBUG
m_numBuffersAllocated++;
@@ -202,7 +230,7 @@ EventPipeBufferList* EventPipeBufferManager::FindThreadToStealFrom()
{
CONTRACTL
{
- THROWS;
+ NOTHROW;
GC_NOTRIGGER;
MODE_ANY;
PRECONDITION(m_lock.OwnedByCurrentThread());
@@ -362,7 +390,7 @@ void EventPipeBufferManager::WriteAllBuffersToFile(EventPipeFile *pFile, LARGE_I
{
CONTRACTL
{
- NOTHROW;
+ THROWS;
GC_NOTRIGGER;
MODE_ANY;
PRECONDITION(pFile != NULL);