2007-12-01 04:08:34 +00:00
|
|
|
#include "MailBox.h"
|
2007-12-09 02:28:28 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
#include "win32/Window.h"
|
|
|
|
#endif
|
2007-12-01 04:08:34 +00:00
|
|
|
|
|
|
|
using namespace boost;
|
|
|
|
|
|
|
|
CMailBox::CMailBox()
|
|
|
|
{
|
2007-12-09 02:28:28 +00:00
|
|
|
m_callDone = false;
|
2007-12-01 04:08:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
CMailBox::~CMailBox()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CMailBox::IsPending() const
|
|
|
|
{
|
|
|
|
return m_calls.size() != 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CMailBox::WaitForCall()
|
|
|
|
{
|
|
|
|
mutex::scoped_lock waitLock(m_waitMutex);
|
|
|
|
if(IsPending()) return;
|
|
|
|
m_waitCondition.wait(waitLock);
|
|
|
|
}
|
|
|
|
|
2007-12-09 02:28:28 +00:00
|
|
|
void CMailBox::SendCall(const FunctionType& function, bool waitForCompletion)
|
2007-12-01 04:08:34 +00:00
|
|
|
{
|
2007-12-09 02:28:28 +00:00
|
|
|
{
|
2007-12-09 03:26:33 +00:00
|
|
|
#ifdef WIN32
|
2007-12-09 02:28:28 +00:00
|
|
|
if(waitForCompletion)
|
|
|
|
{
|
|
|
|
assert(!m_callDone);
|
|
|
|
m_callDone = false;
|
|
|
|
}
|
2007-12-09 03:26:33 +00:00
|
|
|
#endif
|
2007-12-09 02:28:28 +00:00
|
|
|
mutex::scoped_lock waitLock(m_waitMutex);
|
|
|
|
m_calls.push_back(function);
|
|
|
|
m_waitCondition.notify_all();
|
|
|
|
}
|
|
|
|
if(waitForCompletion)
|
|
|
|
{
|
|
|
|
mutex::scoped_lock doneLock(m_doneNotifyMutex);
|
|
|
|
#ifdef WIN32
|
|
|
|
while(!m_callDone)
|
|
|
|
{
|
|
|
|
xtime xt;
|
|
|
|
xtime_get(&xt, boost::TIME_UTC);
|
2007-12-17 04:08:46 +00:00
|
|
|
xt.nsec += 100 * 1000000;
|
2007-12-09 02:28:28 +00:00
|
|
|
m_callFinished.timed_wait(doneLock, xt);
|
|
|
|
MSG wmmsg;
|
|
|
|
while(PeekMessage(&wmmsg, NULL, 0, 0, PM_REMOVE))
|
|
|
|
{
|
|
|
|
TranslateMessage(&wmmsg);
|
|
|
|
DispatchMessage(&wmmsg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_callDone = false;
|
|
|
|
#else
|
|
|
|
m_callFinished.wait(doneLock);
|
|
|
|
#endif
|
|
|
|
}
|
2007-12-01 04:08:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CMailBox::ReceiveCall()
|
|
|
|
{
|
2007-12-11 07:05:37 +00:00
|
|
|
FunctionType function;
|
2007-12-09 02:28:28 +00:00
|
|
|
{
|
|
|
|
mutex::scoped_lock waitLock(m_waitMutex);
|
|
|
|
if(!IsPending()) return;
|
2007-12-11 07:05:37 +00:00
|
|
|
function = *m_calls.begin();
|
2007-12-09 02:28:28 +00:00
|
|
|
m_calls.pop_front();
|
|
|
|
}
|
2007-12-11 07:05:37 +00:00
|
|
|
function();
|
2007-12-09 02:28:28 +00:00
|
|
|
{
|
|
|
|
mutex::scoped_lock doneLock(m_doneNotifyMutex);
|
|
|
|
m_callFinished.notify_all();
|
|
|
|
m_callDone = true;
|
|
|
|
}
|
2007-12-01 04:08:34 +00:00
|
|
|
}
|