Index: src/libchcore/TWriteBufferQueueWrapper.cpp =================================================================== diff -u -N -r6e4ac7776b68464371cd8522a2a8d79fbcab3b28 -rb6a48931b8155a01d871d050f52d915abb2df8ca --- src/libchcore/TWriteBufferQueueWrapper.cpp (.../TWriteBufferQueueWrapper.cpp) (revision 6e4ac7776b68464371cd8522a2a8d79fbcab3b28) +++ src/libchcore/TWriteBufferQueueWrapper.cpp (.../TWriteBufferQueueWrapper.cpp) (revision b6a48931b8155a01d871d050f52d915abb2df8ca) @@ -27,6 +27,9 @@ m_spDataQueue(spQueue), m_eventHasBuffers(true, false) { + if (!spQueue) + throw TCoreException(eErr_InvalidArgument, L"spQueue is NULL", LOCATION); + UpdateHasBuffers(); } @@ -41,10 +44,7 @@ TOverlappedDataBuffer* TWriteBufferQueueWrapper::Pop() { - TOverlappedDataBuffer* pBuffer = m_tClaimedQueue.Pop(); - if(!pBuffer) - pBuffer = m_spDataQueue->Pop(); - + TOverlappedDataBuffer* pBuffer = InternalPop(); if(pBuffer) { pBuffer->InitForWrite(); @@ -54,6 +54,22 @@ return pBuffer; } + TOverlappedDataBuffer* TWriteBufferQueueWrapper::InternalPop() + { + const TOverlappedDataBuffer* pClaimedQueueBuffer = m_tClaimedQueue.Peek(); + if (!pClaimedQueueBuffer) + return m_spDataQueue->Pop(); + + const TOverlappedDataBuffer* pDataQueueBuffer = m_spDataQueue->Peek(); + if (!pDataQueueBuffer) + return m_tClaimedQueue.Pop(); + + if (pClaimedQueueBuffer->GetFilePosition() < pDataQueueBuffer->GetFilePosition()) + return m_tClaimedQueue.Pop(); + else + return m_spDataQueue->Pop(); + } + bool TWriteBufferQueueWrapper::IsBufferReady() const { return !m_tClaimedQueue.IsEmpty() || !m_spDataQueue->IsEmpty();