use less complex worker-thread-synchronization

git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1033 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
Tobias Doerffel
2008-05-30 22:09:12 +00:00
parent 8be14b8518
commit 542baec14b
4 changed files with 25 additions and 24 deletions

View File

@@ -1,3 +1,9 @@
2008-05-30 Tobias Doerffel <tobydox/at/users/dot/sourceforge/dot/net>
* include/mixer.h:
* src/core/mixer.cpp:
use less complex worker-thread-synchronization
2008-05-29 Tobias Doerffel <tobydox/at/users/dot/sourceforge/dot/net>
* src/core/mixer.cpp:

View File

@@ -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)

View File

@@ -457,7 +457,8 @@ private:
bool m_multiThreaded;
QVector<mixerWorkerThread *> m_workers;
int m_numWorkers;
QSemaphore m_workerSem;
QSemaphore m_queueReadySem;
QSemaphore m_workersDoneSem;
playHandleVector m_playHandles;

View File

@@ -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 );