fixing bugs

This commit is contained in:
Vladislav Khorev 2013-03-04 19:09:56 +00:00
parent 3c974a33de
commit 013b1dc344
2 changed files with 31 additions and 8 deletions

View File

@ -7,6 +7,14 @@
namespace SE namespace SE
{ {
namespace ST
{
extern boost::condition_variable FunctionFinishedCondition;
extern boost::mutex FunctionMutex;
}
template<typename RETURNTYPE> template<typename RETURNTYPE>
RETURNTYPE PerformInMainThread(boost::function<RETURNTYPE()> f) RETURNTYPE PerformInMainThread(boost::function<RETURNTYPE()> f)
{ {
@ -18,21 +26,30 @@ namespace SE
{ {
RETURNTYPE result; RETURNTYPE result;
boost::mutex serviceLock; bool functionCalled = false;
boost::function<void()> func = boost::function<void()> func =
[&result, &f, &serviceLock] () [&] ()
{ {
result = f(); result = f();
serviceLock.unlock();
{
boost::mutex::scoped_lock lock(FunctionMutex);
functionCalled = true;
}
FunctionFinishedCondition.notify_one();
}; };
serviceLock.lock();
ST::MainThreadIoService.post(func); ST::MainThreadIoService.post(func);
serviceLock.lock(); boost::mutex::scoped_lock lock(FunctionMutex);
serviceLock.unlock();
while (!functionCalled)
{
FunctionFinishedCondition.wait(lock);
}
return result; return result;

View File

@ -8,7 +8,13 @@ namespace SE
boost::asio::io_service MainThreadIoService; boost::asio::io_service MainThreadIoService;
boost::thread::id MainThreadId; boost::thread::id MainThreadId;
boost::condition_variable FunctionFinishedCondition;
boost::mutex FunctionMutex;
} }
#ifndef UTILS_ENGINE #ifndef UTILS_ENGINE
void AssertIfInMainThread() void AssertIfInMainThread()
{ {