コード例 #1
0
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);
		}
	}
}
コード例 #2
0
ファイル: dgThread.cpp プロジェクト: Hurleyworks/MiniNewton
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;
}
コード例 #3
0
void dgAsyncThread::Terminate()
{
	if (IsThreadActive()) {
		dgInterlockedExchange(&m_terminate, 1);
		m_mutex.Release();
		Close();
	}
}
コード例 #4
0
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);
}
コード例 #5
0
void dgAsyncThread::Terminate()
{
	if (StillBusy()) {
		dgInterlockedExchange(&m_terminate, 1);
		m_myMutex.Release();
		Close();
	}
} 
コード例 #6
0
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();
	}
}
コード例 #7
0
void dgMutexThread::Terminate()
{
	if (IsThreadActive()) {
		dgInterlockedExchange(&m_terminate, 1);
		m_callerMutex.Release();
		m_myMutex.Release();
		Close();
	}
}