* http://www.pulse-eight.net/
*/
-#include "../threads/mutex.h"
+#include "lib/platform/threads/mutex.h"
#include <queue>
namespace PLATFORM
{
public:
SyncedBuffer(size_t iMaxSize = 100) :
- m_maxSize(iMaxSize) {}
+ m_maxSize(iMaxSize),
+ m_bHasMessages(false) {}
virtual ~SyncedBuffer(void)
{
CLockObject lock(m_mutex);
while (!m_buffer.empty())
m_buffer.pop();
+ m_condition.Broadcast();
}
size_t Size(void)
return false;
m_buffer.push(entry);
+ m_bHasMessages = true;
+ m_condition.Signal();
return true;
}
- bool Pop(_BType &entry)
+ bool Pop(_BType &entry, uint32_t iTimeoutMs = 0)
{
bool bReturn(false);
CLockObject lock(m_mutex);
+
+ // wait for a signal if the buffer is empty
+ if (m_buffer.empty() && iTimeoutMs > 0)
+ {
+ if (!m_condition.Wait(m_mutex, m_bHasMessages, iTimeoutMs))
+ return bReturn;
+ }
+
+ // pop the first item
if (!m_buffer.empty())
{
entry = m_buffer.front();
m_buffer.pop();
+ m_bHasMessages = !m_buffer.empty();
bReturn = true;
}
return bReturn;
size_t m_maxSize;
std::queue<_BType> m_buffer;
CMutex m_mutex;
+ CCondition<bool> m_condition;
+ bool m_bHasMessages;
};
};