Index: src/libchcore/TReadBufferQueueWrapper.cpp
===================================================================
diff -u -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()