From 542baec14bc8563c5d8f78ca4698e88f680be99b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 30 May 2008 22:09:12 +0000 Subject: [PATCH] use less complex worker-thread-synchronization git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1033 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 6 ++++++ configure.in | 4 ++-- include/mixer.h | 3 ++- src/core/mixer.cpp | 36 +++++++++++++++--------------------- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 31115aa86..3fdb8be9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-05-30 Tobias Doerffel + + * include/mixer.h: + * src/core/mixer.cpp: + use less complex worker-thread-synchronization + 2008-05-29 Tobias Doerffel * src/core/mixer.cpp: diff --git a/configure.in b/configure.in index aa099f8ae..c82030ab9 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.4.0-svn20080519, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080519) +AC_INIT(lmms, 0.4.0-svn20080530, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080530) AM_CONFIG_HEADER(config.h) diff --git a/include/mixer.h b/include/mixer.h index 3a2a9fd1d..8fa9fd3eb 100644 --- a/include/mixer.h +++ b/include/mixer.h @@ -457,7 +457,8 @@ private: bool m_multiThreaded; QVector m_workers; int m_numWorkers; - QSemaphore m_workerSem; + QSemaphore m_queueReadySem; + QSemaphore m_workersDoneSem; playHandleVector m_playHandles; diff --git a/src/core/mixer.cpp b/src/core/mixer.cpp index 2d9bb5a19..750902466 100644 --- a/src/core/mixer.cpp +++ b/src/core/mixer.cpp @@ -98,7 +98,6 @@ void * aligned_malloc( int _bytes ) - class mixerWorkerThread : public QThread { public: @@ -155,9 +154,8 @@ public: mixerWorkerThread( mixer * _mixer ) : QThread( _mixer ), m_mixer( _mixer ), - m_sem( &m_mixer->m_workerSem ), - m_jobWait( 1 ), - m_jobAccepted( 1 ), + m_queueReadySem( &m_mixer->m_queueReadySem ), + m_workersDoneSem( &m_mixer->m_workersDoneSem ), m_jobQueue( NULL ) { start( QThread::TimeCriticalPriority ); @@ -167,11 +165,9 @@ public: { } - void addJob( jobQueue * _q ) + void setJobQueue( jobQueue * _q ) { m_jobQueue = _q; - m_jobWait.release(); - m_jobAccepted.acquire(); } @@ -181,13 +177,9 @@ private: sampleFrame * working_buf = (sampleFrame *) aligned_malloc( m_mixer->framesPerPeriod() * sizeof( sampleFrame ) ); - m_jobWait.acquire(); - m_jobAccepted.acquire(); while( 1 ) { - m_jobWait.acquire(); - m_sem->acquire(); - m_jobAccepted.release(); + m_queueReadySem->acquire(); for( jobQueueItems::iterator it = m_jobQueue->items.begin(); it != m_jobQueue->items.end(); ++it ) @@ -233,15 +225,14 @@ private: } #endif } - m_sem->release(); + m_workersDoneSem->release(); } aligned_free( working_buf ); } mixer * m_mixer; - QSemaphore * m_sem; - QSemaphore m_jobWait; - QSemaphore m_jobAccepted; + QSemaphore * m_queueReadySem; + QSemaphore * m_workersDoneSem; jobQueue * m_jobQueue; } ; @@ -257,7 +248,8 @@ mixer::mixer( void ) : m_multiThreaded( QThread::idealThreadCount() > 1 ), m_workers(), m_numWorkers( m_multiThreaded ? QThread::idealThreadCount() : 0 ), - m_workerSem( m_numWorkers ), + m_queueReadySem( m_numWorkers ), + m_workersDoneSem( m_numWorkers ), m_qualitySettings( qualitySettings::Mode_Draft ), m_masterGain( 1.0f ), m_audioDev( NULL ), @@ -303,6 +295,8 @@ mixer::mixer( void ) : if( m_multiThreaded ) { + m_queueReadySem.acquire( m_numWorkers ); + m_workersDoneSem.acquire( m_numWorkers ); for( int i = 0; i < m_numWorkers; ++i ) { m_workers.push_back( new mixerWorkerThread( this ) ); @@ -429,12 +423,12 @@ bool mixer::criticalXRuns( void ) const #define DISTRIBUTE_JOB_QUEUE(_jq) \ for( int i = 0; i < m_numWorkers; ++i ) \ { \ - m_workers[i]->addJob( &_jq ); \ - } + m_workers[i]->setJobQueue( &_jq ); \ + } \ + m_queueReadySem.release( m_numWorkers ); \ #define WAIT_FOR_JOBS() \ - m_workerSem.acquire( m_numWorkers ); \ - m_workerSem.release( m_numWorkers ); + m_workersDoneSem.acquire( m_numWorkers );