From 4f5d31f862e72103b701515f2b7e40c72b8cf1ac Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 19 Oct 2009 01:04:18 +0200 Subject: [PATCH] MixerWorkerThread: exit outer loop in processJobQueue() if finished Exit the outer loop of processJobQueue() Only as soon as we went through the job queue without having processed at least one job. In MixerWorkerThread::waitForJobs() re-introduced "pause" instruction on x86 and x86_64 giving better performance on HyperThreading systems. These improvements however still do not solve all performance and multithreading issues. --- src/core/MixerWorkerThread.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/core/MixerWorkerThread.cpp b/src/core/MixerWorkerThread.cpp index 539b32245..8941b1a56 100644 --- a/src/core/MixerWorkerThread.cpp +++ b/src/core/MixerWorkerThread.cpp @@ -63,8 +63,10 @@ void MixerWorkerThread::quit() void MixerWorkerThread::processJobQueue() { - while( s_jobQueue.itemsDone != s_jobQueue.queueSize ) + bool processedJob = true; + while( processedJob && (int) s_jobQueue.itemsDone < (int) s_jobQueue.queueSize ) { + processedJob = false; for( int i = 0; i < s_jobQueue.queueSize; ++i ) { ThreadableJob * job = @@ -72,6 +74,7 @@ void MixerWorkerThread::processJobQueue() if( job ) { job->process( m_workingBuf ); + processedJob = true; s_jobQueue.itemsDone.fetchAndAddOrdered( 1 ); } } @@ -118,6 +121,13 @@ void MixerWorkerThread::waitForJobs() // TODO: this is dirty! mixer * m = engine::getMixer(); m->m_workers[m->m_numWorkers]->processJobQueue(); + + while( (int) s_jobQueue.itemsDone < (int) s_jobQueue.queueSize ) + { +#if defined(LMMS_HOST_X86) || defined(LMMS_HOST_X86_64) + asm( "pause" ); +#endif + } }