void Ext::DefaultCpuDispatcher::submitTask(PxBaseTask& task) { if(!mNumThreads) { // no worker threads, run directly task.runProfiled(); task.release(); return; } Ps::Thread::Id currentThread = Ps::Thread::getId(); // TODO: Could use TLS to make this more efficient for(PxU32 i = 0; i < mNumThreads; ++i) { if(mWorkerThreads[i].tryAcceptJobToLocalQueue(task, currentThread)) return mWorkReady.set(); } SharedQueueEntry* entry = mQueueEntryPool.getEntry(&task); if (entry) { mJobList.push(*entry); mWorkReady.set(); } }
void Ext::DefaultCpuDispatcher::runTask(PxBaseTask& task) { #ifdef PX_PROFILE task.runProfiled(); #else task.run(); #endif }
void CpuWorkerThread::execute() { mThreadId = getId(); while (!quitIsSignalled()) { mOwner->resetWakeSignal(); PxBaseTask* task = TaskQueueHelper::fetchTask(mLocalJobList, mQueueEntryPool); if (!task) { task = mOwner->getJob(); } if (!task) { task = mOwner->stealJob(); } if (task) { #if PHYSX_PROFILE_SDK if (mPvdBinding!=NULL) { task->runProfiled(); } else { task->run(); } #else task->run(); #endif task->release(); } else { mOwner->waitForWork(); } } quit(); };