{
SpinLockHolder _slh(&m_lock);
// Pop the event from the buffer.
- pOldestContainingList->PopNextEvent(stopTimeStamp);
+ pOldestContainingList->PopNextEvent(pOldestContainingBuffer, pOldestInstance);
}
}
{
SpinLockHolder _slh(&m_lock);
// Pop the event from the buffer.
- pOldestContainingList->PopNextEvent(stopTimeStamp);
+ pOldestContainingList->PopNextEvent(pOldestContainingBuffer, pOldestInstance);
}
// Return the oldest event that hasn't yet been processed.
}
}
-EventPipeBuffer* EventPipeBufferList::TryGetReadBuffer(LARGE_INTEGER beforeTimeStamp, EventPipeBuffer* pNewReadBuffer)
-{
- LIMITED_METHOD_CONTRACT;
- _ASSERTE(EventPipe::IsBufferManagerLockOwnedByCurrentThread());
-
- // is it possible that the read buffer has events that occur before 'beforeTimeStamp'?
- if (pNewReadBuffer == NULL || pNewReadBuffer->GetCreationTimeStamp().QuadPart >= beforeTimeStamp.QuadPart)
- {
- return NULL;
- }
-
- // we can't read from a buffer while it is being simultaneously being written, we need to preempt the writer.
- if (pNewReadBuffer->GetVolatileState() == EventPipeBufferState::WRITABLE)
- {
- {
- SpinLockHolder _slh(m_pThread->GetLock());
- if (m_pThread->GetWriteBuffer() == pNewReadBuffer)
- {
- m_pThread->SetWriteBuffer(nullptr);
- }
- }
- _ASSERTE(pNewReadBuffer->GetVolatileState() == EventPipeBufferState::READ_ONLY);
- }
-
- return pNewReadBuffer;
-}
-
-EventPipeEventInstance* EventPipeBufferList::PeekNextEvent(LARGE_INTEGER beforeTimeStamp, EventPipeBuffer **pContainingBuffer)
+void EventPipeBufferList::PopNextEvent(EventPipeBuffer *pContainingBuffer, EventPipeEventInstance *pNext)
{
CONTRACTL
{
}
CONTRACTL_END;
- EventPipeBuffer* pReadBuffer = TryGetReadBuffer(beforeTimeStamp, m_pHeadBuffer);
-
- // If the read buffer is still NULL, then this list contains no buffers with events in the time range we care about.
- if(pReadBuffer == NULL)
- {
- return NULL;
- }
-
- // Get the next event in the buffer.
- EventPipeEventInstance *pNext = pReadBuffer->PeekNext(beforeTimeStamp);
-
- // If the next event is NULL, then go to the next buffer.
- if(pNext == NULL)
- {
- pReadBuffer = TryGetReadBuffer(beforeTimeStamp, pReadBuffer->GetNext());
- if(pReadBuffer != NULL)
- {
- pNext = pReadBuffer->PeekNext(beforeTimeStamp);
- }
- }
-
- // Set the containing buffer.
- if(pNext != NULL && pContainingBuffer != NULL)
- {
- *pContainingBuffer = pReadBuffer;
- }
-
- // Make sure pContainingBuffer is properly set.
- _ASSERTE((pNext == NULL) || (pNext != NULL && pContainingBuffer == NULL) || (pNext != NULL && *pContainingBuffer == pReadBuffer));
- return pNext;
-}
-
-EventPipeEventInstance* EventPipeBufferList::PopNextEvent(LARGE_INTEGER beforeTimeStamp)
-{
- CONTRACTL
- {
- NOTHROW;
- GC_NOTRIGGER;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- // Get the next event.
- EventPipeBuffer *pContainingBuffer = NULL;
- EventPipeEventInstance *pNext = PeekNextEvent(beforeTimeStamp, &pContainingBuffer);
-
// Check to see if we need to clean-up the buffer that contained the previously popped event.
if(pContainingBuffer->GetPrevious() != NULL)
{
// If the event is non-NULL, pop it.
if(pNext != NULL && pContainingBuffer != NULL)
{
- pContainingBuffer->PopNext(beforeTimeStamp);
+ pContainingBuffer->PopNext(pNext);
}
-
- return pNext;
}
EventPipeThread* EventPipeBufferList::GetThread()
// The number of buffers in the list.
unsigned int m_bufferCount;
- // Check pNewReadBuffer to see if it has events in the right time-range and convert it to a readable
- // state if needed
- EventPipeBuffer* TryGetReadBuffer(LARGE_INTEGER beforeTimeStamp, EventPipeBuffer* pNewReadBuffer);
-
public:
EventPipeBufferList(EventPipeBufferManager *pManager, EventPipeThread* pThread);
// Get the count of buffers in the list.
unsigned int GetCount() const;
- // Get the next event as long as it is before the specified timestamp.
- EventPipeEventInstance* PeekNextEvent(LARGE_INTEGER beforeTimeStamp, EventPipeBuffer **pContainingBuffer);
-
- // Get the next event as long as it is before the specified timestamp, and also mark it as read.
- EventPipeEventInstance* PopNextEvent(LARGE_INTEGER beforeTimeStamp);
+ // TODO
+ void PopNextEvent(EventPipeBuffer *pContainingBuffer, EventPipeEventInstance *pNext);
// Get the thread associated with this list.
EventPipeThread* GetThread();