Index: src/libchcore/TOrderedBufferQueue.cpp =================================================================== diff -u -N -r3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9 -r6e4ac7776b68464371cd8522a2a8d79fbcab3b28 --- src/libchcore/TOrderedBufferQueue.cpp (.../TOrderedBufferQueue.cpp) (revision 3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9) +++ src/libchcore/TOrderedBufferQueue.cpp (.../TOrderedBufferQueue.cpp) (revision 6e4ac7776b68464371cd8522a2a8d79fbcab3b28) @@ -19,6 +19,7 @@ #include "stdafx.h" #include "TOrderedBufferQueue.h" #include "TOverlappedDataBuffer.h" +#include "TCoreException.h" namespace chcore { @@ -35,7 +36,10 @@ void TOrderedBufferQueue::Push(TOverlappedDataBuffer* pBuffer) { - m_setBuffers.insert(pBuffer); + auto pairInsert = m_setBuffers.insert(pBuffer); + if (!pairInsert.second) + throw TCoreException(eErr_InvalidArgument, L"Tried to insert duplicate buffer into the collection", LOCATION); + UpdateHasBuffers(); } @@ -47,7 +51,7 @@ TOverlappedDataBuffer* pBuffer = *m_setBuffers.begin(); m_setBuffers.erase(m_setBuffers.begin()); - if(!pBuffer->HasError()) + if(!pBuffer->HasError() && m_ullExpectedBufferPosition != NoPosition) m_ullExpectedBufferPosition += pBuffer->GetRequestedDataSize(); UpdateHasBuffers(); @@ -89,6 +93,15 @@ return m_eventHasBuffers.Handle(); } + void TOrderedBufferQueue::ReleaseBuffers(const TBufferListPtr& spBuffers) + { + for(TOverlappedDataBuffer* pBuffer : m_setBuffers) + { + spBuffers->Push(pBuffer); + } + m_setBuffers.clear(); + } + void TOrderedBufferQueue::UpdateHasBuffers() { if(!m_setBuffers.empty() && (m_ullExpectedBufferPosition == NoPosition || Peek()->GetFilePosition() == m_ullExpectedBufferPosition))