-rw-r--r-- | noncore/multimedia/opieplayer2/threadutil.cpp | 17 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/threadutil.h | 6 |
2 files changed, 11 insertions, 12 deletions
diff --git a/noncore/multimedia/opieplayer2/threadutil.cpp b/noncore/multimedia/opieplayer2/threadutil.cpp index 7a9e1a4..ff38b1e 100644 --- a/noncore/multimedia/opieplayer2/threadutil.cpp +++ b/noncore/multimedia/opieplayer2/threadutil.cpp @@ -124,81 +124,86 @@ void WaitCondition::wakeAll() } struct Thread::Data { Data() : isRunning( false ) {} pthread_t self; Mutex guard; bool isRunning; WaitCondition finishCondition; + + Thread *thr; + + void run() { thr->run(); } }; extern "C" { static void terminate_thread( void *arg ) { Thread::Data *data = ( Thread::Data* )arg; assert( data ); AutoLock locker( data->guard ); data->isRunning = false; data->finishCondition.wakeAll(); } -void *_threadutil_start_thread( void *arg ) +static void *start_thread( void *arg ) { - Thread *thr = ( Thread* )arg; + Thread::Data *data = ( Thread::Data* )arg; - pthread_cleanup_push( terminate_thread, thr->d ); + pthread_cleanup_push( terminate_thread, data ); - thr->d->isRunning = true; - thr->run(); + data->isRunning = true; + data->run(); pthread_cleanup_pop( true ); Thread::exit(); return 0; // never reached } } Thread::Thread() : d( new Data ) { + d->thr = this; } Thread::~Thread() { assert( d->isRunning == false ); delete d; } void Thread::start() { AutoLock lock( d->guard ); if ( d->isRunning ) { qDebug( "ThreadUtil::Thread::start() called for running thread." ); return; } pthread_attr_t attributes; pthread_attr_init( &attributes ); pthread_attr_setscope( &attributes, PTHREAD_SCOPE_SYSTEM ); - int err = pthread_create( &d->self, &attributes, _threadutil_start_thread, ( void* )this ); + int err = pthread_create( &d->self, &attributes, start_thread, ( void* )d ); if ( err != 0 ) { qDebug( "ThreadUtil::Thread::start() : can't create thread: %s", strerror( err ) ); pthread_attr_destroy( &attributes ); return; } pthread_attr_destroy( &attributes ); } void Thread::terminate() { AutoLock lock( d->guard ); if ( !d->isRunning ) diff --git a/noncore/multimedia/opieplayer2/threadutil.h b/noncore/multimedia/opieplayer2/threadutil.h index 21ae6b2..2fd0c68 100644 --- a/noncore/multimedia/opieplayer2/threadutil.h +++ b/noncore/multimedia/opieplayer2/threadutil.h @@ -17,29 +17,24 @@ Boston, MA 02111-1307, USA. */ #ifndef THREADUTIL_H #define THREADUTIL_H #include <qvaluelist.h> #include <qobject.h> #include <qguardedptr.h> class QSocketNotifier; -extern "C" -{ - void *_threadutil_start_thread( void* ); -} - namespace ThreadUtil { class Mutex { friend class WaitCondition; public: Mutex(); ~Mutex(); void lock(); void unlock(); @@ -79,25 +74,24 @@ namespace ThreadUtil void wakeAll(); private: struct Data; Data *d; WaitCondition( const WaitCondition & ); WaitCondition &operator=( const WaitCondition & ); }; class Thread { - friend void *::_threadutil_start_thread( void* ); public: struct Data; Thread(); virtual ~Thread(); void start(); void terminate(); bool wait(); bool isRunning() const; |