Index: src/libchcore/TOverlappedDataBufferQueue.cpp =================================================================== diff -u -N -re4005a958c9412d890eeff1e8087c8298aa7bcf7 -radf2d680643ef85665b042e03fed274ab8f11180 --- src/libchcore/TOverlappedDataBufferQueue.cpp (.../TOverlappedDataBufferQueue.cpp) (revision e4005a958c9412d890eeff1e8087c8298aa7bcf7) +++ src/libchcore/TOverlappedDataBufferQueue.cpp (.../TOverlappedDataBufferQueue.cpp) (revision adf2d680643ef85665b042e03fed274ab8f11180) @@ -36,8 +36,6 @@ m_eventWritePossible(true, false), m_eventWriteFinished(true, false), m_eventAllBuffersAccountedFor(true, true), - m_stBufferSize(0), - m_ullNextExpectedWritePosition(0), m_bDataSourceFinished(false), m_bDataWritingFinished(false), m_ullNextReadBufferOrder(0), @@ -51,8 +49,6 @@ m_eventWritePossible(true, false), m_eventWriteFinished(true, false), m_eventAllBuffersAccountedFor(true, false), - m_stBufferSize(0), - m_ullNextExpectedWritePosition(0), m_bDataSourceFinished(false), m_bDataWritingFinished(false), m_ullNextReadBufferOrder(0), @@ -111,8 +107,11 @@ return nullptr; m_setFullBuffers.erase(m_setFullBuffers.begin()); - m_ullNextExpectedWritePosition += pBuffer->GetBytesTransferred(); + // if this is the last part - mark that writing is finished, so that no other buffer will be written + if (pBuffer->IsLastPart()) + m_bDataWritingFinished = true; + ++m_ullNextWriteBufferOrder; UpdateWritePossibleEvent(); @@ -129,14 +128,6 @@ if (!pBuffer) THROW_CORE_EXCEPTION(eErr_InvalidPointer); - // special case - if we already know that there was an end of file and the new packet arrived with the same information and no data - // then it can be treated as an empty buffer - if (pBuffer->IsLastPart() && m_bDataSourceFinished && pBuffer->GetBytesTransferred() == 0) - { - AddEmptyBuffer(pBuffer); - return; - } - std::pair pairInsertInfo = m_setFullBuffers.insert(pBuffer); if (!pairInsertInfo.second) THROW_CORE_EXCEPTION(eErr_InvalidOverlappedPosition); @@ -174,10 +165,6 @@ ++m_ullNextFinishedBufferOrder; - // if this is the last part - mark that writing is finished, so that no other buffer will be written - if (pBuffer->IsLastPart()) - m_bDataWritingFinished = true; - UpdateWriteFinishedEvent(); m_eventAllBuffersAccountedFor.ResetEvent(); @@ -228,25 +215,25 @@ // sanity check - if any of the buffers are still in use, we can't change the sizes if (m_listAllBuffers.size() != m_listEmptyBuffers.size()) THROW_CORE_EXCEPTION(eErr_InternalProblem); + if (stBufferSize == 0) + THROW_CORE_EXCEPTION(eErr_InvalidArgument); - if (stBufferSize > m_stBufferSize) + if (stBufferSize != GetSingleBufferSize()) { // buffer sizes increased - clear current buffers and proceed with creating new ones m_listAllBuffers.clear(); m_listEmptyBuffers.clear(); - m_setFullBuffers.clear(); } else if (stCount == m_listAllBuffers.size()) return; // nothing really changed - else if (stCount < m_listAllBuffers.size()) - stCount = m_listAllBuffers.size() - stCount; // allocate only the missing buffers else if (stCount > m_listAllBuffers.size()) + stCount -= m_listAllBuffers.size(); // allocate only the missing buffers + else if (stCount < m_listAllBuffers.size()) { // there are too many buffers - reduce m_listEmptyBuffers.clear(); - m_setFullBuffers.clear(); - size_t stCountToRemove = stCount - m_listAllBuffers.size(); + size_t stCountToRemove = m_listAllBuffers.size() - stCount; m_listAllBuffers.erase(m_listAllBuffers.begin(), m_listAllBuffers.begin() + stCountToRemove); for (const auto& upElement : m_listAllBuffers) @@ -267,11 +254,23 @@ m_listAllBuffers.push_back(std::move(upBuffer)); } - m_stBufferSize = stCount; UpdateReadPossibleEvent(); UpdateAllBuffersAccountedFor(); } +size_t TOverlappedDataBufferQueue::GetTotalBufferCount() const +{ + return m_listAllBuffers.size(); +} + +size_t TOverlappedDataBufferQueue::GetSingleBufferSize() const +{ + if (m_listAllBuffers.empty()) + return 0; + + return (*m_listAllBuffers.begin())->GetBufferSize(); +} + void TOverlappedDataBufferQueue::DataSourceChanged() { CleanupBuffers();