diff options
Diffstat (limited to 'src/vm/eventpipebuffermanager.cpp')
-rw-r--r-- | src/vm/eventpipebuffermanager.cpp | 42 |
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); |