Index: src/libchcore/TOverlappedDataBufferQueue.cpp =================================================================== diff -u -N -re8f31b0f922b402878356e130c866c4f3682a7f5 -r861eb97e5f43584f9537b4aff0558f6689bd0e38 --- src/libchcore/TOverlappedDataBufferQueue.cpp (.../TOverlappedDataBufferQueue.cpp) (revision e8f31b0f922b402878356e130c866c4f3682a7f5) +++ src/libchcore/TOverlappedDataBufferQueue.cpp (.../TOverlappedDataBufferQueue.cpp) (revision 861eb97e5f43584f9537b4aff0558f6689bd0e38) @@ -163,9 +163,7 @@ m_setFinishedBuffers.erase(m_setFinishedBuffers.begin()); - ++m_ullNextFinishedBufferOrder; - - UpdateWriteFinishedEvent(); + m_eventWriteFinished.ResetEvent(); // faster than UpdateWriteFinishedEvent() and the final effect should be the same m_eventAllBuffersAccountedFor.ResetEvent(); return pBuffer; @@ -174,6 +172,16 @@ return nullptr; } + void TOverlappedDataBufferQueue::MarkFinishedBufferAsComplete(TOverlappedDataBuffer* pBuffer) + { + if(!pBuffer) + throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION); + + // allow next finished buffer to be processed + ++m_ullNextFinishedBufferOrder; + UpdateWriteFinishedEvent(); + } + void TOverlappedDataBufferQueue::AddFinishedBuffer(TOverlappedDataBuffer* pBuffer) { if (!pBuffer) @@ -309,7 +317,7 @@ } } - void TOverlappedDataBufferQueue::WaitForMissingBuffers(HANDLE hKillEvent) + void TOverlappedDataBufferQueue::WaitForMissingBuffersAndResetState(HANDLE hKillEvent) { enum { eKillThread = 0, eAllBuffersReturned, eHandleCount }; std::array arrHandles = { hKillEvent, m_eventAllBuffersAccountedFor.Handle() }; @@ -333,5 +341,11 @@ break; } } + + std::copy(m_setFullBuffers.begin(), m_setFullBuffers.end(), std::back_inserter(m_listEmptyBuffers)); + std::copy(m_setFinishedBuffers.begin(), m_setFinishedBuffers.end(), std::back_inserter(m_listEmptyBuffers)); + + m_setFinishedBuffers.clear(); + m_setFullBuffers.clear(); } }