diff options
author | Andrew Au <andrewau@microsoft.com> | 2019-05-02 11:06:52 -0700 |
---|---|---|
committer | Andrew Au <cshung@gmail.com> | 2019-05-02 16:11:56 -0700 |
commit | 299c9d5733368d101882eb89d897c88f094997c1 (patch) | |
tree | b37b03a6ada3ce0f0af29bdacd7182413a8a6d0d /src | |
parent | cd9880b95993abaa3ca1724153acc03221b7b5e4 (diff) | |
download | coreclr-299c9d5733368d101882eb89d897c88f094997c1.tar.gz coreclr-299c9d5733368d101882eb89d897c88f094997c1.tar.bz2 coreclr-299c9d5733368d101882eb89d897c88f094997c1.zip |
Make sure we check the second buffer's creation date before we return
Diffstat (limited to 'src')
-rw-r--r-- | src/vm/eventpipebuffermanager.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/vm/eventpipebuffermanager.cpp b/src/vm/eventpipebuffermanager.cpp index 7957bc707a..1201b447c4 100644 --- a/src/vm/eventpipebuffermanager.cpp +++ b/src/vm/eventpipebuffermanager.cpp @@ -927,6 +927,8 @@ EventPipeBuffer* EventPipeBufferList::TryGetBuffer(LARGE_INTEGER beforeTimeStamp * 4.) The head buffer is read completely. * This case requires special attention because it is possible that the next buffer in the list contain the oldest event. Fortunately, it is * already read so it is safe to read it to determine this case. + * + * In any case, if the desired buffer is created after beforeTimeStamp, then we can stop. */ if (this->m_pHeadBuffer == nullptr) @@ -934,30 +936,35 @@ EventPipeBuffer* EventPipeBufferList::TryGetBuffer(LARGE_INTEGER beforeTimeStamp // Case 1 return nullptr; } - if (this->m_pHeadBuffer->GetCreationTimeStamp().QuadPart >= beforeTimeStamp.QuadPart) - { - // If the oldest buffer is still newer than the beforeTimeStamp, we can stop. - return nullptr; - } + + EventPipeBuffer* candidate = nullptr; EventPipeBufferState bufferState = this->m_pHeadBuffer->GetVolatileState(); if (bufferState != EventPipeBufferState::READ_ONLY) { // Case 2 (2.1 or 2.2) - return this->m_pHeadBuffer; + candidate = this->m_pHeadBuffer; } else { if (this->m_pHeadBuffer->PeekNext(beforeTimeStamp)) { // Case 3 - return this->m_pHeadBuffer; + candidate = this->m_pHeadBuffer; } else { // Case 4 - return this->m_pHeadBuffer->GetNext(); + candidate = this->m_pHeadBuffer->GetNext(); } } + + if (candidate == nullptr || candidate->GetCreationTimeStamp().QuadPart >= beforeTimeStamp.QuadPart) + { + // If the oldest buffer is still newer than the beforeTimeStamp, we can stop. + return nullptr; + } + + return candidate; } void EventPipeBufferList::ConvertBufferToReadOnly(EventPipeBuffer* pNewReadBuffer) |