void dgAsyncThread::Execute(dgInt32 threadID) { dgAssert(threadID == m_id); while (!m_terminate) { m_mutex.Wait(); if (!m_terminate) { dgInterlockedExchange(&m_inUpdate, 1); dgInterlockedExchange(&m_beginUpdate, 1); TickCallback(threadID); dgInterlockedExchange(&m_inUpdate, 0); } } }
void* dgThread::dgThreadSystemCallback(void* threadData) { dgFloatExceptions exception; dgSetPrecisionDouble precision; dgThread* const me = (dgThread*) threadData; dTimeTrackerSetThreadName(me->m_name); dgInterlockedExchange(&me->m_threadRunning, 1); me->Execute(me->m_id); dgInterlockedExchange(&me->m_threadRunning, 0); dgThreadYield(); return 0; }
void dgAsyncThread::Terminate() { if (IsThreadActive()) { dgInterlockedExchange(&m_terminate, 1); m_mutex.Release(); Close(); } }
void dgMutexThread::Execute (dgInt32 threadID) { // suspend this tread until the call thread decide to dgAssert (threadID == m_id); while (!m_terminate) { // wait for the main thread to signal an update SuspendExecution(m_myMutex); if (!m_terminate) { dgInterlockedExchange(&m_isBusy, 1); TickCallback(threadID); // let main thread resume execution m_callerMutex.Release(); dgInterlockedExchange(&m_isBusy, 0); } } dgInterlockedExchange(&m_isBusy, 0); }
void dgAsyncThread::Terminate() { if (StillBusy()) { dgInterlockedExchange(&m_terminate, 1); m_myMutex.Release(); Close(); } }
void dgWorld::RunStep () { static int zzzz; if (zzzz == 50) { DG_START_RECORDING("../../../../sdk/dProfiler/xxxx.tt"); } if (zzzz == 500) { DG_STOP_RECORDING(); } zzzz++; DG_TRACKTIME(__FUNCTION__); dgUnsigned64 timeAcc = dgGetTimeInMicrosenconds(); dgFloat32 step = m_savetimestep / m_numberOfSubsteps; for (dgUnsigned32 i = 0; i < m_numberOfSubsteps; i ++) { dgInterlockedExchange(&m_delayDelateLock, 1); StepDynamics (step); dgInterlockedExchange(&m_delayDelateLock, 0); dgDeadBodies& bodyList = *this; dgDeadJoints& jointList = *this; jointList.DestroyJoints (*this); bodyList.DestroyBodies (*this); } const dgBodyMasterList* const masterList = this; dgBodyMasterList::dgListNode* node = masterList->GetFirst(); const dgInt32 threadsCount = GetThreadCount(); for (dgInt32 i = 0; i < threadsCount; i++) { QueueJob(UpdateTransforms, this, node, "dgWorld::UpdateTransforms"); node = node ? node->GetNext() : NULL; } SynchronizationBarrier(); if (m_postUpdateCallback) { m_postUpdateCallback (this, m_savetimestep); } m_lastExecutionTime = (dgGetTimeInMicrosenconds() - timeAcc) * dgFloat32 (1.0e-6f); if (!m_concurrentUpdate) { m_mutex.Release(); } }
void dgMutexThread::Terminate() { if (IsThreadActive()) { dgInterlockedExchange(&m_terminate, 1); m_callerMutex.Release(); m_myMutex.Release(); Close(); } }