Index: src/libchcore/TReadBufferQueueWrapper.cpp =================================================================== diff -u -N -rb6a48931b8155a01d871d050f52d915abb2df8ca -rda7737de7046ba0ecd255240fb36b4a46584ebf2 --- src/libchcore/TReadBufferQueueWrapper.cpp (.../TReadBufferQueueWrapper.cpp) (revision b6a48931b8155a01d871d050f52d915abb2df8ca) +++ src/libchcore/TReadBufferQueueWrapper.cpp (.../TReadBufferQueueWrapper.cpp) (revision da7737de7046ba0ecd255240fb36b4a46584ebf2) @@ -97,14 +97,14 @@ bool TReadBufferQueueWrapper::IsBufferReady() const { if(IsDataSourceFinished()) - return !m_tClaimedQueue.IsEmpty(); + return !m_tClaimedQueue.empty(); else - return !m_tClaimedQueue.IsEmpty() || !m_spUnorderedQueue->IsEmpty(); + return !m_tClaimedQueue.empty() || !m_spUnorderedQueue->IsEmpty(); } size_t TReadBufferQueueWrapper::GetCount() const { - return m_tClaimedQueue.GetCount(); + return m_tClaimedQueue.size(); } void TReadBufferQueueWrapper::SetDataSourceFinished(TOverlappedDataBuffer* pBuffer) @@ -116,12 +116,24 @@ { m_ullDataSourceFinishedPos = pBuffer->GetFilePosition(); - std::vector vItems = m_tClaimedQueue.GetUnneededLastParts(); - for(TOverlappedDataBuffer* pBuffer : vItems) + // release superfluous finished buffers + auto iterFind = std::find_if(m_tClaimedQueue.begin(), m_tClaimedQueue.end(), [](TOverlappedDataBuffer* pBuffer) { return pBuffer->IsLastPart(); }); + if(iterFind == m_tClaimedQueue.end() || ++iterFind == m_tClaimedQueue.end()) { - m_spUnorderedQueue->Push(pBuffer); + UpdateHasBuffers(); + return; } + auto iterInvalidParts = std::find_if(iterFind, m_tClaimedQueue.end(), [](TOverlappedDataBuffer* pBuffer) { return !pBuffer->IsLastPart(); }); + if(iterInvalidParts != m_tClaimedQueue.end()) + throw TCoreException(eErr_InvalidArgument, L"Found non-last-parts after last-part", LOCATION); + + for(auto iter = iterFind; iter != m_tClaimedQueue.end(); ++iter) + { + m_spUnorderedQueue->Push(*iter); + } + m_tClaimedQueue.erase(iterFind, m_tClaimedQueue.end()); + UpdateHasBuffers(); } }