summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/threadutil.cpp17
-rw-r--r--noncore/multimedia/opieplayer2/threadutil.h6
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;