Play-/Source/MailBox.cpp

83 lines
1.5 KiB
C++
Raw Permalink Normal View History

#include "MailBox.h"
bool CMailBox::IsPending() const
{
return m_calls.size() != 0;
}
void CMailBox::WaitForCall()
{
2024-05-18 11:41:27 -04:00
std::unique_lock callLock(m_callMutex);
while(!IsPending())
{
m_waitCondition.wait(callLock);
}
}
void CMailBox::WaitForCall(unsigned int timeOut)
{
2024-05-18 11:41:27 -04:00
std::unique_lock callLock(m_callMutex);
if(IsPending()) return;
m_waitCondition.wait_for(callLock, std::chrono::milliseconds(timeOut));
}
void CMailBox::FlushCalls()
{
2018-04-30 21:01:23 +01:00
SendCall([]() {}, true);
}
void CMailBox::SendCall(const FunctionType& function, bool waitForCompletion)
{
std::future<void> future;
2024-05-18 11:41:27 -04:00
{
MESSAGE message;
message.function = function;
if(waitForCompletion)
{
message.promise = std::make_unique<std::promise<void>>();
future = message.promise->get_future();
}
2024-05-18 11:41:27 -04:00
std::lock_guard callLock(m_callMutex);
m_calls.push_back(std::move(message));
}
2018-04-30 21:01:23 +01:00
m_waitCondition.notify_all();
if(waitForCompletion)
{
future.wait();
}
}
void CMailBox::SendCall(FunctionType&& function)
{
{
MESSAGE message;
message.function = std::move(function);
2024-05-18 11:41:27 -04:00
std::lock_guard callLock(m_callMutex);
m_calls.push_back(std::move(message));
}
2018-04-30 21:01:23 +01:00
m_waitCondition.notify_all();
}
void CMailBox::ReceiveCall()
{
MESSAGE message;
{
2024-05-18 11:41:27 -04:00
std::lock_guard callLock(m_callMutex);
if(!IsPending()) return;
message = std::move(m_calls.front());
m_calls.pop_front();
}
message.function();
if(message.promise)
{
message.promise->set_value();
}
}