Index: src/libchcore/TOverlappedWriter.cpp =================================================================== diff -u -N -r3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9 -r6e4ac7776b68464371cd8522a2a8d79fbcab3b28 --- src/libchcore/TOverlappedWriter.cpp (.../TOverlappedWriter.cpp) (revision 3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9) +++ src/libchcore/TOverlappedWriter.cpp (.../TOverlappedWriter.cpp) (revision 6e4ac7776b68464371cd8522a2a8d79fbcab3b28) @@ -40,6 +40,11 @@ { } + TOverlappedDataBuffer* TOverlappedWriter::GetWriteBuffer() + { + return m_tBuffersToWrite.Pop(); + } + void TOverlappedWriter::AddFailedWriteBuffer(TOverlappedDataBuffer* pBuffer) { if(!pBuffer) @@ -66,9 +71,30 @@ TOverlappedDataBuffer* TOverlappedWriter::GetFinishedBuffer() { - return m_tFinishedBuffers.Pop(); + TOverlappedDataBuffer* pBuffer = m_tFinishedBuffers.Pop(); + + if (pBuffer && pBuffer->IsLastPart()) + { + if (m_pLastPartBuffer != nullptr) + throw TCoreException(eErr_InternalProblem, L"Encountered another 'last-part' finished buffer", LOCATION); + m_pLastPartBuffer = pBuffer; + } + + return pBuffer; } + void TOverlappedWriter::MarkAsFinalized(TOverlappedDataBuffer* pBuffer) + { + if (!pBuffer) + throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION); + + if (pBuffer != m_pLastPartBuffer) + throw TCoreException(eErr_InvalidArgument, L"Trying to mark different buffer as finalized", LOCATION); + + m_bDataWritingFinished = true; + m_pLastPartBuffer = nullptr; + } + void TOverlappedWriter::AddFinishedBuffer(TOverlappedDataBuffer* pBuffer) { if (!pBuffer) @@ -87,6 +113,13 @@ size_t TOverlappedWriter::GetBufferCount() const { - return m_tBuffersToWrite.GetCount() + m_tFailedWriteBuffers.GetCount() + m_tFinishedBuffers.GetCount(); + return m_tFailedWriteBuffers.GetCount() + m_tFinishedBuffers.GetCount(); } + + void TOverlappedWriter::ReleaseBuffers(const TBufferListPtr& spList) + { + m_tBuffersToWrite.ReleaseBuffers(spList); + m_tFailedWriteBuffers.ReleaseBuffers(spList); + m_tFinishedBuffers.ReleaseBuffers(spList); + } }