//--------------------------------------------------------------------- void DefaultWorkQueue::startup(bool forceRestart) { if (mIsRunning) { if (forceRestart) shutdown(); else return; } mShuttingDown = false; mWorkerFunc = OGRE_NEW_T(WorkerFunc(this), MEMCATEGORY_GENERAL); LogManager::getSingleton().stream() << "DefaultWorkQueue('" << mName << "') initialising on thread " << #if OGRE_THREAD_SUPPORT OGRE_THREAD_CURRENT_ID #else "main" #endif << "."; #if OGRE_THREAD_SUPPORT if (mWorkerRenderSystemAccess) Root::getSingleton().getRenderSystem()->preExtraThreadsStarted(); mNumThreadsRegisteredWithRS = 0; for (uint8 i = 0; i < mWorkerThreadCount; ++i) { OGRE_THREAD_CREATE(t, *mWorkerFunc); mWorkers.push_back(t); } if (mWorkerRenderSystemAccess) { OGRE_LOCK_MUTEX_NAMED(mInitMutex, initLock); // have to wait until all threads are registered with the render system while (mNumThreadsRegisteredWithRS < mWorkerThreadCount) OGRE_THREAD_WAIT(mInitSync, mInitMutex, initLock); Root::getSingleton().getRenderSystem()->postExtraThreadsStarted(); } #endif mIsRunning = true; }
//--------------------------------------------------------------------- void DefaultWorkQueue::startup(bool forceRestart) { if (mIsRunning) { if (forceRestart) shutdown(); else return; } mShuttingDown = false; mWorkerFunc = OGRE_NEW_T(WorkerFunc(this), MEMCATEGORY_GENERAL); LogManager::getSingleton().stream() << "DefaultWorkQueue('" << mName << "') initialising."; #if OGRE_NO_TBB_SCHEDULER == 0 mTaskScheduler.initialize(mWorkerThreadCount); #endif if (mWorkerRenderSystemAccess) { Root::getSingleton().getRenderSystem()->preExtraThreadsStarted(); RegisterRSWorker worker (this); // current thread need not be registered mRegisteredThreads.insert(tbb::this_tbb_thread::get_id()); while (mRegisteredThreads.size() < mWorkerThreadCount) { // spawn tasks until all worker threads have registered themselves with the RS for (size_t i = 0; i < mWorkerThreadCount*3; ++i) { mTaskGroup.run(worker); } mTaskGroup.wait(); } Root::getSingleton().getRenderSystem()->postExtraThreadsStarted(); } mIsRunning = true; }