|
@@ -1,4 +1,5 @@
|
|
|
#include "CmCoreThread.h"
|
|
#include "CmCoreThread.h"
|
|
|
|
|
+#include "BsThreadPool.h"
|
|
|
|
|
|
|
|
using namespace std::placeholders;
|
|
using namespace std::placeholders;
|
|
|
|
|
|
|
@@ -7,9 +8,7 @@ namespace BansheeEngine
|
|
|
CM_THREADLOCAL CoreThread::AccessorContainer* CoreThread::mAccessor = nullptr;
|
|
CM_THREADLOCAL CoreThread::AccessorContainer* CoreThread::mAccessor = nullptr;
|
|
|
|
|
|
|
|
CoreThread::CoreThread()
|
|
CoreThread::CoreThread()
|
|
|
- : mCoreThreadFunc(nullptr)
|
|
|
|
|
- , mCoreThreadStarted(false)
|
|
|
|
|
- , mCoreThreadShutdown(false)
|
|
|
|
|
|
|
+ : mCoreThreadShutdown(false)
|
|
|
, mCommandQueue(nullptr)
|
|
, mCommandQueue(nullptr)
|
|
|
, mMaxCommandNotifyId(0)
|
|
, mMaxCommandNotifyId(0)
|
|
|
, mSyncedCoreAccessor(nullptr)
|
|
, mSyncedCoreAccessor(nullptr)
|
|
@@ -53,17 +52,8 @@ namespace BansheeEngine
|
|
|
void CoreThread::initCoreThread()
|
|
void CoreThread::initCoreThread()
|
|
|
{
|
|
{
|
|
|
#if !CM_FORCE_SINGLETHREADED_RENDERING
|
|
#if !CM_FORCE_SINGLETHREADED_RENDERING
|
|
|
- mCoreThreadFunc = cm_new<CoreThreadWorkerFunc>(this);
|
|
|
|
|
-
|
|
|
|
|
#if CM_THREAD_SUPPORT
|
|
#if CM_THREAD_SUPPORT
|
|
|
- CM_THREAD_CREATE(t, *mCoreThreadFunc);
|
|
|
|
|
- mCoreThread = t;
|
|
|
|
|
-
|
|
|
|
|
- CM_LOCK_MUTEX_NAMED(mCoreThreadStartMutex, lock);
|
|
|
|
|
-
|
|
|
|
|
- while(!mCoreThreadStarted)
|
|
|
|
|
- CM_THREAD_WAIT(mCoreThreadStartCondition, mCoreThreadStartMutex, lock);
|
|
|
|
|
-
|
|
|
|
|
|
|
+ ThreadPool::instance().run("Core", std::bind(&CoreThread::runCoreThread, this));
|
|
|
#else
|
|
#else
|
|
|
CM_EXCEPT(InternalErrorException, "Attempting to start a core thread but application isn't compiled with thread support.");
|
|
CM_EXCEPT(InternalErrorException, "Attempting to start a core thread but application isn't compiled with thread support.");
|
|
|
#endif
|
|
#endif
|
|
@@ -73,19 +63,9 @@ namespace BansheeEngine
|
|
|
void CoreThread::runCoreThread()
|
|
void CoreThread::runCoreThread()
|
|
|
{
|
|
{
|
|
|
#if !CM_FORCE_SINGLETHREADED_RENDERING
|
|
#if !CM_FORCE_SINGLETHREADED_RENDERING
|
|
|
- MemStack::beginThread();
|
|
|
|
|
-
|
|
|
|
|
mCoreThreadId = CM_THREAD_CURRENT_ID;
|
|
mCoreThreadId = CM_THREAD_CURRENT_ID;
|
|
|
mSyncedCoreAccessor = cm_new<CoreThreadAccessor<CommandQueueSync>>(CM_THREAD_CURRENT_ID);
|
|
mSyncedCoreAccessor = cm_new<CoreThreadAccessor<CommandQueueSync>>(CM_THREAD_CURRENT_ID);
|
|
|
|
|
|
|
|
- {
|
|
|
|
|
- CM_LOCK_MUTEX(mCoreThreadStartMutex);
|
|
|
|
|
-
|
|
|
|
|
- mCoreThreadStarted = true;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- CM_THREAD_NOTIFY_ALL(mCoreThreadStartCondition)
|
|
|
|
|
-
|
|
|
|
|
while(true)
|
|
while(true)
|
|
|
{
|
|
{
|
|
|
// Wait until we get some ready commands
|
|
// Wait until we get some ready commands
|
|
@@ -98,7 +78,6 @@ namespace BansheeEngine
|
|
|
if(mCoreThreadShutdown)
|
|
if(mCoreThreadShutdown)
|
|
|
{
|
|
{
|
|
|
cm_delete(mSyncedCoreAccessor);
|
|
cm_delete(mSyncedCoreAccessor);
|
|
|
- MemStack::endThread();
|
|
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -126,20 +105,8 @@ namespace BansheeEngine
|
|
|
// Wake all threads. They will quit after they see the shutdown flag
|
|
// Wake all threads. They will quit after they see the shutdown flag
|
|
|
CM_THREAD_NOTIFY_ALL(mCommandReadyCondition);
|
|
CM_THREAD_NOTIFY_ALL(mCommandReadyCondition);
|
|
|
|
|
|
|
|
- CM_THREAD_JOIN((*mCoreThread));
|
|
|
|
|
- CM_THREAD_DESTROY(mCoreThread);
|
|
|
|
|
-
|
|
|
|
|
- mCoreThread = nullptr;
|
|
|
|
|
mCoreThreadId = CM_THREAD_CURRENT_ID;
|
|
mCoreThreadId = CM_THREAD_CURRENT_ID;
|
|
|
-
|
|
|
|
|
- if(mCoreThreadFunc != nullptr)
|
|
|
|
|
- {
|
|
|
|
|
- cm_delete(mCoreThreadFunc);
|
|
|
|
|
- mCoreThreadFunc = nullptr;
|
|
|
|
|
- }
|
|
|
|
|
#endif
|
|
#endif
|
|
|
-
|
|
|
|
|
- mCoreThreadStarted = false;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
CoreAccessorPtr CoreThread::getAccessor()
|
|
CoreAccessorPtr CoreThread::getAccessor()
|
|
@@ -311,19 +278,4 @@ namespace BansheeEngine
|
|
|
CM_EXCEPT(InternalErrorException, "This method cannot be accessed from the core thread.");
|
|
CM_EXCEPT(InternalErrorException, "This method cannot be accessed from the core thread.");
|
|
|
#endif
|
|
#endif
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- /************************************************************************/
|
|
|
|
|
- /* THREAD WORKER */
|
|
|
|
|
- /************************************************************************/
|
|
|
|
|
-
|
|
|
|
|
- CoreThread::CoreThreadWorkerFunc::CoreThreadWorkerFunc(CoreThread* owner)
|
|
|
|
|
- :mOwner(owner)
|
|
|
|
|
- {
|
|
|
|
|
- assert(mOwner != nullptr);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- void CoreThread::CoreThreadWorkerFunc::operator()()
|
|
|
|
|
- {
|
|
|
|
|
- mOwner->runCoreThread();
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|