void dgThreads::SynchronizationBarrier() { while (m_workInProgress) { dgThreadYield(); } }
dgInt32 dgThreads::GetWork(dgWorkerThread** job) { #ifdef _WIN32 HANDLE hWaitHandles[2]; hWaitHandles[0] = m_workToDo; hWaitHandles[1] = m_exit; if ((WaitForMultipleObjects(2, hWaitHandles, FALSE, INFINITE) - WAIT_OBJECT_0) == 1) { return 0; } EnterCriticalSection(&m_criticalSection); *job = m_queue[m_bottomIndex]; m_bottomIndex = (m_bottomIndex + 1) % DG_MAXQUEUE; ReleaseSemaphore(m_emptySlot, 1, NULL); LeaveCriticalSection(&m_criticalSection); #else for (;;) { while ( m_workToDo == 0 ) { dgThreadYield(); } dgSpinLock( &m_workToDoSpinLock ); if ( m_workToDo > 0 ) { break; } dgSpinUnlock( &m_workToDoSpinLock ); } dgInterlockedDecrement( &m_workToDo ); dgSpinUnlock( &m_workToDoSpinLock ); if ( m_exit ) { return 0; } dgSpinLock( &m_criticalSection ); dgWorkerThread* cWorker = m_queue[m_bottomIndex]; *job = cWorker; m_bottomIndex = (m_bottomIndex+1) % (DG_MAXQUEUE); dgInterlockedIncrement( &m_emptySlot ); dgSpinUnlock( &m_criticalSection ); #endif return 1; }
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; }
//Queues up another to work dgInt32 dgThreads::SubmitJob(dgWorkerThread* const job) { if (!m_numOfThreads) { _ASSERTE(job->m_threadIndex != -1); job->ThreadExecute(); } else { #ifdef _WIN32 dgInterlockedIncrement(&m_workInProgress); if (WaitForSingleObject(m_emptySlot, INFINITE) != WAIT_OBJECT_0) { return (0); } EnterCriticalSection(&m_criticalSection); m_queue[m_topIndex] = job; m_topIndex = (m_topIndex + 1) % DG_MAXQUEUE; ReleaseSemaphore(m_workToDo, 1, NULL); LeaveCriticalSection(&m_criticalSection); #else dgInterlockedIncrement(&m_workInProgress); while ( m_emptySlot == 0 ) { dgThreadYield(); } dgInterlockedDecrement( &m_emptySlot ); dgSpinLock(&m_criticalSection); m_queue[m_topIndex] = job; m_topIndex = (m_topIndex + 1) % DG_MAXQUEUE; dgInterlockedIncrement( &m_workToDo ); dgSpinUnlock( &m_criticalSection ); #endif } return 1; }
void dgWorld::Sync () { while (IsBusy()) { dgThreadYield(); } }
void dgWorld::Sync () { while (dgMutexThread::IsBusy()) { dgThreadYield(); } }
void dgAsyncThread::Sync() { while (m_inUpdate) { dgThreadYield(); } }