diff --git a/include/Utils/ThreadUtilsImpl.h b/include/Utils/ThreadUtilsImpl.h index f2944a6..81cc3f9 100644 --- a/include/Utils/ThreadUtilsImpl.h +++ b/include/Utils/ThreadUtilsImpl.h @@ -6,6 +6,14 @@ namespace SE { + + namespace ST + { + extern boost::condition_variable FunctionFinishedCondition; + + extern boost::mutex FunctionMutex; + } + template RETURNTYPE PerformInMainThread(boost::function f) @@ -18,21 +26,30 @@ namespace SE { RETURNTYPE result; - boost::mutex serviceLock; - + bool functionCalled = false; + boost::function func = - [&result, &f, &serviceLock] () + [&] () { result = f(); - serviceLock.unlock(); + + { + boost::mutex::scoped_lock lock(FunctionMutex); + functionCalled = true; + } + FunctionFinishedCondition.notify_one(); }; - serviceLock.lock(); + ST::MainThreadIoService.post(func); - serviceLock.lock(); - serviceLock.unlock(); + boost::mutex::scoped_lock lock(FunctionMutex); + + while (!functionCalled) + { + FunctionFinishedCondition.wait(lock); + } return result; diff --git a/src/Utils/ThreadUtils.cpp b/src/Utils/ThreadUtils.cpp index 30a303b..eec7120 100644 --- a/src/Utils/ThreadUtils.cpp +++ b/src/Utils/ThreadUtils.cpp @@ -2,13 +2,19 @@ namespace SE { - + namespace ST { boost::asio::io_service MainThreadIoService; boost::thread::id MainThreadId; + + boost::condition_variable FunctionFinishedCondition; + + boost::mutex FunctionMutex; } + + #ifndef UTILS_ENGINE void AssertIfInMainThread() {