示例#1
0
void dgThreads::SynchronizationBarrier()
{
  while (m_workInProgress)
  {
    dgThreadYield();
  }
}
示例#2
0
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;
}
示例#3
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;
}
示例#4
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;
}
示例#5
0
void dgWorld::Sync ()
{
	while (IsBusy()) {
		dgThreadYield();
	}
}
示例#6
0
void dgWorld::Sync ()
{
	while (dgMutexThread::IsBusy()) {
		dgThreadYield();
	}
}
void dgAsyncThread::Sync()
{
	while (m_inUpdate) {
		dgThreadYield();
	}
}