Index: src/libchcore/TReadBufferQueueWrapper.cpp =================================================================== diff -u -N -rb051cbac8dac8c448507aa7c64753af9cf793af5 -rc719644bb4360fcf7ccf6f1139bcae852bd6effd --- src/libchcore/TReadBufferQueueWrapper.cpp (.../TReadBufferQueueWrapper.cpp) (revision b051cbac8dac8c448507aa7c64753af9cf793af5) +++ src/libchcore/TReadBufferQueueWrapper.cpp (.../TReadBufferQueueWrapper.cpp) (revision c719644bb4360fcf7ccf6f1139bcae852bd6effd) @@ -23,14 +23,14 @@ namespace chcore { - TReadBufferQueueWrapper::TReadBufferQueueWrapper(const TBufferListPtr& spUnorderedQueue, unsigned long long ullNextReadPosition, DWORD dwChunkSize) : - m_spEmptyBuffers(spUnorderedQueue), + TReadBufferQueueWrapper::TReadBufferQueueWrapper(const TBufferListPtr& spEmptyBuffers, unsigned long long ullNextReadPosition, DWORD dwChunkSize) : + m_spEmptyBuffers(spEmptyBuffers), m_eventHasBuffers(true, false), m_ullNextReadPosition(ullNextReadPosition), m_dwChunkSize(dwChunkSize) { - if(!spUnorderedQueue) - throw TCoreException(eErr_InvalidArgument, L"spUnorderedQueue is NULL", LOCATION); + if(!spEmptyBuffers) + throw TCoreException(eErr_InvalidArgument, L"spEmptyBuffers is NULL", LOCATION); if(dwChunkSize == 0) throw TCoreException(eErr_InvalidArgument, L"dwChunkSize cannot be 0", LOCATION); @@ -103,14 +103,14 @@ bool TReadBufferQueueWrapper::IsBufferReady() const { if(IsDataSourceFinished()) - return !m_tRetryBuffers.empty(); + return !m_tRetryBuffers.IsEmpty(); - return !m_tRetryBuffers.empty() || !m_spEmptyBuffers->IsEmpty(); + return !m_tRetryBuffers.IsEmpty() || !m_spEmptyBuffers->IsEmpty(); } size_t TReadBufferQueueWrapper::GetCount() const { - return m_tRetryBuffers.size(); + return m_tRetryBuffers.GetCount(); } void TReadBufferQueueWrapper::SetDataSourceFinished(TOverlappedDataBuffer* pBuffer) @@ -123,25 +123,6 @@ if(pBuffer->GetFilePosition() < m_ullDataSourceFinishedPos) { m_ullDataSourceFinishedPos = pBuffer->GetFilePosition(); - - // release superfluous finished buffers - auto iterFind = std::find_if(m_tRetryBuffers.begin(), m_tRetryBuffers.end(), [](TOverlappedDataBuffer* pBuffer) { return pBuffer->IsLastPart(); }); - if(iterFind == m_tRetryBuffers.end() || ++iterFind == m_tRetryBuffers.end()) - { - UpdateHasBuffers(); - return; - } - - auto iterInvalidParts = std::find_if(iterFind, m_tRetryBuffers.end(), [](TOverlappedDataBuffer* pBuffer) { return !pBuffer->IsLastPart(); }); - if(iterInvalidParts != m_tRetryBuffers.end()) - throw TCoreException(eErr_InvalidArgument, L"Found non-last-parts after last-part", LOCATION); - - for(auto iter = iterFind; iter != m_tRetryBuffers.end(); ++iter) - { - m_spEmptyBuffers->Push(*iter); - } - m_tRetryBuffers.erase(iterFind, m_tRetryBuffers.end()); - UpdateHasBuffers(); } } @@ -168,7 +149,7 @@ void TReadBufferQueueWrapper::UpdateProcessingRange(unsigned long long ullNewPosition) { - if(!m_tRetryBuffers.empty()) + if(!m_tRetryBuffers.IsEmpty()) throw TCoreException(eErr_InvalidData, L"Cannot update processing range when processing already started", LOCATION); m_ullNextReadPosition = ullNewPosition; }