fixed: events were added before event queue was ready, caused debug build assert failure.

removed sleep hack in favour of cond var wait.
This commit is contained in:
jerry
2014-04-17 10:56:25 +00:00
parent 0d087d4edc
commit 45c1cde698
10 changed files with 126 additions and 25 deletions

View File

@@ -18,12 +18,15 @@
#include "base/EventQueue.h"
#include "mt/Mutex.h"
#include "mt/Lock.h"
#include "arch/Arch.h"
#include "base/Log.h"
#include "base/SimpleEventQueueBuffer.h"
#include "base/Stopwatch.h"
#include "base/IEventJob.h"
#include "base/EventTypes.h"
#include "base/Log.h"
#include "base/XBase.h"
EVENT_TYPE_ACCESSOR(CClient)
EVENT_TYPE_ACCESSOR(IStream)
@@ -78,7 +81,9 @@ CEventQueue::CEventQueue() :
m_typesForCServerApp(NULL),
m_typesForIKeyState(NULL),
m_typesForIPrimaryScreen(NULL),
m_typesForIScreen(NULL)
m_typesForIScreen(NULL),
m_readyMutex(new CMutex),
m_readyCondVar(new CCondVar<bool>(m_readyMutex, false))
{
m_mutex = ARCH->newMutex();
ARCH->setSignalHandler(CArch::kINTERRUPT, &interrupt, this);
@@ -89,6 +94,9 @@ CEventQueue::CEventQueue() :
CEventQueue::~CEventQueue()
{
delete m_buffer;
delete m_readyCondVar;
delete m_readyMutex;
ARCH->setSignalHandler(CArch::kINTERRUPT, NULL, NULL);
ARCH->setSignalHandler(CArch::kTERMINATE, NULL, NULL);
ARCH->closeMutex(m_mutex);
@@ -98,6 +106,16 @@ void
CEventQueue::loop()
{
m_buffer->init();
*m_readyCondVar = true;
m_readyCondVar->broadcast();
LOG((CLOG_DEBUG "event queue is ready"));
while (!m_pending.empty()) {
LOG((CLOG_DEBUG "add pending events to buffer"));
CEvent& event = m_pending.front();
addEventToBuffer(event);
m_pending.pop();
}
CEvent event;
getEvent(event);
@@ -268,18 +286,27 @@ CEventQueue::addEvent(const CEvent& event)
dispatchEvent(event);
CEvent::deleteData(event);
}
else if (!(*m_readyCondVar)) {
m_pending.push(event);
}
else {
CArchMutexLock lock(m_mutex);
// store the event's data locally
UInt32 eventID = saveEvent(event);
// add it
if (!m_buffer->addEvent(eventID)) {
// failed to send event
removeEvent(eventID);
CEvent::deleteData(event);
}
addEventToBuffer(event);
}
}
void
CEventQueue::addEventToBuffer(const CEvent& event)
{
CArchMutexLock lock(m_mutex);
// store the event's data locally
UInt32 eventID = saveEvent(event);
// add it
if (!m_buffer->addEvent(eventID)) {
// failed to send event
removeEvent(eventID);
CEvent::deleteData(event);
}
}
@@ -526,6 +553,21 @@ CEventQueue::getSystemTarget()
return &m_systemTarget;
}
void
CEventQueue::waitForReady() const
{
double timeout = ARCH->time() + 5;
m_readyCondVar->lock();
while (!m_readyCondVar->wait()) {
if(ARCH->time() > timeout) {
throw std::runtime_error("event queue is not ready within 5 sec");
}
}
m_readyCondVar->unlock();
}
//
// CEventQueue::CTimer
//