Index: src/libchcore/TBufferList.cpp =================================================================== diff -u -N -ra1f5b3d99f2f175b102d81379698ea1f08e42cce -r10d42e85d810f6da082cb2ce4415dcb72903410e --- src/libchcore/TBufferList.cpp (.../TBufferList.cpp) (revision a1f5b3d99f2f175b102d81379698ea1f08e42cce) +++ src/libchcore/TBufferList.cpp (.../TBufferList.cpp) (revision 10d42e85d810f6da082cb2ce4415dcb72903410e) @@ -19,6 +19,7 @@ #include "stdafx.h" #include "TBufferList.h" #include "TCoreException.h" +#include namespace chcore { @@ -32,50 +33,69 @@ if(!pBuffer) throw TCoreException(eErr_InvalidArgument, L"pBuffer", LOCATION); - m_listBuffers.push_front(pBuffer); - UpdateEvent(); + { + boost::unique_lock lock(m_mutex); + + m_listBuffers.push_front(pBuffer); + UpdateEvent(); + } + m_notifier(); } TOverlappedDataBuffer* TBufferList::Pop() { - if(m_listBuffers.empty()) - return nullptr; + TOverlappedDataBuffer* pBuffer = nullptr; - TOverlappedDataBuffer* pBuffer = m_listBuffers.front(); - m_listBuffers.pop_front(); + { + boost::unique_lock lock(m_mutex); - UpdateEvent(); + if(m_listBuffers.empty()) + return nullptr; + pBuffer = m_listBuffers.front(); + m_listBuffers.pop_front(); + + UpdateEvent(); + } + m_notifier(); return pBuffer; } void TBufferList::Clear() { - bool bRemoved = !m_listBuffers.empty(); - m_listBuffers.clear(); - - if (bRemoved) + bool bRemoved = false; { - UpdateEvent(); - m_notifier(); + boost::unique_lock lock(m_mutex); + + bRemoved = !m_listBuffers.empty(); + m_listBuffers.clear(); + + if(bRemoved) + UpdateEvent(); } + + if(bRemoved) + m_notifier(); } size_t TBufferList::GetCount() const { + boost::shared_lock lock(m_mutex); return m_listBuffers.size(); } bool TBufferList::IsEmpty() const { + boost::shared_lock lock(m_mutex); return m_listBuffers.empty(); } void TBufferList::SetExpectedBuffersCount(size_t stExpectedBuffers) { + boost::shared_lock lock(m_mutex); m_stExpectedBuffers = stExpectedBuffers; UpdateEvent(); }