Index: src/libchcore/TReadBufferQueueWrapper.cpp =================================================================== diff -u -N -rd99302fce795dbb5139659016a5da7948f141fb4 -rcb1a7688ad1ac1081a219c170754776e986ccc8c --- src/libchcore/TReadBufferQueueWrapper.cpp (.../TReadBufferQueueWrapper.cpp) (revision d99302fce795dbb5139659016a5da7948f141fb4) +++ src/libchcore/TReadBufferQueueWrapper.cpp (.../TReadBufferQueueWrapper.cpp) (revision cb1a7688ad1ac1081a219c170754776e986ccc8c) @@ -34,7 +34,7 @@ m_stMaxReadAheadBuffers(stMaxReadAheadBuffers), m_spOtfBuffersCount(spOtfBuffersCount), m_spCurrentReadAheadBuffers(spCurrentReadAheadBuffers), - m_eventHasBuffers(true, false) + m_eventHasBuffers(false, true) { if(!spEmptyBuffers) throw TCoreException(eErr_InvalidArgument, L"spEmptyBuffers is NULL", LOCATION); @@ -53,8 +53,6 @@ m_currentReadAheadConnector = m_spCurrentReadAheadBuffers->GetNotifier().connect(boost::bind(&TReadBufferQueueWrapper::UpdateHasBuffers, this)); m_retryBuffersConnector = m_tRetryBuffers.GetSharedCount()->GetNotifier().connect(boost::bind(&TReadBufferQueueWrapper::UpdateHasBuffers, this)); m_otfBuffersConnector = m_spOtfBuffersCount->GetNotifier().connect(boost::bind(&TReadBufferQueueWrapper::UpdateHasBuffers, this)); - - UpdateHasBuffers(); } TReadBufferQueueWrapper::~TReadBufferQueueWrapper() @@ -96,12 +94,14 @@ TOverlappedDataBuffer* TReadBufferQueueWrapper::Pop() { - if(!IsBufferReady()) + if(m_spOtfBuffersCount->GetValue() >= m_stMaxOtfBuffers) return nullptr; - // always return retry buffers first + if(m_spCurrentReadAheadBuffers->GetValue() >= m_stMaxReadAheadBuffers) + return nullptr; + TOverlappedDataBuffer* pBuffer = m_tRetryBuffers.Pop(); - if(!pBuffer) + if(!pBuffer && !IsDataSourceFinished()) { pBuffer = m_spEmptyBuffers->Pop(); if(pBuffer) @@ -111,23 +111,12 @@ } } + if(pBuffer) + m_eventHasBuffers.SetEvent(); + return pBuffer; } - bool TReadBufferQueueWrapper::IsBufferReady() const - { - if(m_spOtfBuffersCount->GetValue() >= m_stMaxOtfBuffers) - return false; - - if(m_spCurrentReadAheadBuffers->GetValue() >= m_stMaxReadAheadBuffers) - return false; - - if(!m_tRetryBuffers.IsEmpty()) - return true; - - return !IsDataSourceFinished() && !m_spEmptyBuffers->IsEmpty(); - } - void TReadBufferQueueWrapper::SetDataSourceFinished(TOverlappedDataBuffer* pBuffer) { if(!pBuffer) @@ -154,7 +143,7 @@ void TReadBufferQueueWrapper::UpdateHasBuffers() { - m_eventHasBuffers.SetEvent(IsBufferReady()); + m_eventHasBuffers.SetEvent(); } void TReadBufferQueueWrapper::ClearBuffers()