Index: src/libchcore/TOverlappedReader.cpp =================================================================== diff -u -rc4cbf6cd567821f9a981586ab5d8294a26f873be -r593ca68706f3a3c7c2a3820b02a56fc24d5bea11 --- src/libchcore/TOverlappedReader.cpp (.../TOverlappedReader.cpp) (revision c4cbf6cd567821f9a981586ab5d8294a26f873be) +++ src/libchcore/TOverlappedReader.cpp (.../TOverlappedReader.cpp) (revision 593ca68706f3a3c7c2a3820b02a56fc24d5bea11) @@ -27,9 +27,12 @@ TOverlappedReader::TOverlappedReader(const logger::TLogFileDataPtr& spLogFileData, const TBufferListPtr& spEmptyBuffers, unsigned long long ullFilePos, DWORD dwChunkSize) : m_spLog(logger::MakeLogger(spLogFileData, L"DataBuffer")), - m_tEmptyBuffers(spEmptyBuffers, ullFilePos, dwChunkSize), + m_spEmptyBuffers(spEmptyBuffers), + m_tInputBuffers(spEmptyBuffers, ullFilePos, dwChunkSize), m_spFullBuffers(std::make_shared(ullFilePos)) { + if(!spLogFileData) + throw TCoreException(eErr_InvalidArgument, L"spLogFileData is NULL", LOCATION); if(!spEmptyBuffers) throw TCoreException(eErr_InvalidArgument, L"spMemoryPool", LOCATION); if(dwChunkSize == 0) @@ -42,31 +45,45 @@ TOverlappedDataBuffer* TOverlappedReader::GetEmptyBuffer() { - return m_tEmptyBuffers.Pop(); + if(m_bReleaseMode) + return nullptr; + + return m_tInputBuffers.Pop(); } void TOverlappedReader::AddEmptyBuffer(TOverlappedDataBuffer* pBuffer, bool bKeepPosition) { if(!pBuffer) throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION); - LOG_TRACE(m_spLog) << L"Releasing empty buffer; buffer-order: " << pBuffer->GetFilePosition(); - - m_tEmptyBuffers.Push(pBuffer, bKeepPosition); + if(m_bReleaseMode) + m_tInputBuffers.Push(pBuffer, false); + else + { + LOG_TRACE(m_spLog) << L"Releasing empty buffer; buffer-order: " << pBuffer->GetFilePosition(); + m_tInputBuffers.Push(pBuffer, bKeepPosition); + } } void TOverlappedReader::AddFailedReadBuffer(TOverlappedDataBuffer* pBuffer) { if (!pBuffer) throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION); - LOG_TRACE(m_spLog) << L"Queuing buffer for re-read; buffer-order: " << pBuffer->GetFilePosition(); - - m_spFullBuffers->PushError(pBuffer, m_tEmptyBuffers); + if(m_bReleaseMode) + m_tInputBuffers.Push(pBuffer, false); + else + { + LOG_TRACE(m_spLog) << L"Queuing buffer for re-read; buffer-order: " << pBuffer->GetFilePosition(); + m_spFullBuffers->PushError(pBuffer, m_tInputBuffers); + } } TOverlappedDataBuffer* TOverlappedReader::GetFailedReadBuffer() { + if(m_bReleaseMode) + return nullptr; + return m_spFullBuffers->PopError(); } @@ -75,33 +92,36 @@ if (!pBuffer) throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION); - LOG_TRACE(m_spLog) << L"Queuing buffer as full; buffer-order: " << pBuffer->GetFilePosition() << - L", requested-data-size: " << pBuffer->GetRequestedDataSize() << - L", real-data-size: " << pBuffer->GetRealDataSize() << - L", file-position: " << pBuffer->GetFilePosition() << - L", error-code: " << pBuffer->GetErrorCode() << - L", status-code: " << pBuffer->GetStatusCode() << - L", is-last-part: " << pBuffer->IsLastPart(); + if(m_bReleaseMode) + { + m_tInputBuffers.Push(pBuffer, false); + } + else + { + LOG_TRACE(m_spLog) << L"Queuing buffer as full; buffer-order: " << pBuffer->GetFilePosition() << + L", requested-data-size: " << pBuffer->GetRequestedDataSize() << + L", real-data-size: " << pBuffer->GetRealDataSize() << + L", file-position: " << pBuffer->GetFilePosition() << + L", error-code: " << pBuffer->GetErrorCode() << + L", status-code: " << pBuffer->GetStatusCode() << + L", is-last-part: " << pBuffer->IsLastPart(); - if(pBuffer->IsLastPart()) - m_tEmptyBuffers.SetDataSourceFinished(pBuffer); + if(pBuffer->IsLastPart()) + m_tInputBuffers.SetDataSourceFinished(pBuffer); - m_spFullBuffers->Push(pBuffer); + m_spFullBuffers->Push(pBuffer); + } } TOrderedBufferQueuePtr TOverlappedReader::GetFinishedQueue() const { return m_spFullBuffers; } - size_t TOverlappedReader::GetBufferCount() const + void TOverlappedReader::ReleaseBuffers() { - return m_tEmptyBuffers.GetCount() + m_spFullBuffers->GetCount(); + m_bReleaseMode = true; + m_tInputBuffers.ReleaseBuffers(m_spEmptyBuffers); + m_spFullBuffers->ReleaseBuffers(m_spEmptyBuffers); } - - void TOverlappedReader::ReleaseBuffers(const TBufferListPtr& spBuffers) - { - m_tEmptyBuffers.ReleaseBuffers(spBuffers); - m_spFullBuffers->ReleaseBuffers(spBuffers); - } }