summaryrefslogtreecommitdiff
authorsimon <simon>2002-12-11 11:05:52 (UTC)
committer simon <simon>2002-12-11 11:05:52 (UTC)
commitdd7fcdf1589c8513055f6475d3a1f33075d971d8 (patch) (side-by-side diff)
tree3b4927a023eea68d1c529b4852ce2cdd1801db49
parent616e7437498c7adcad77d9b79e9c450a75b260ca (diff)
downloadopie-dd7fcdf1589c8513055f6475d3a1f33075d971d8.zip
opie-dd7fcdf1589c8513055f6475d3a1f33075d971d8.tar.gz
opie-dd7fcdf1589c8513055f6475d3a1f33075d971d8.tar.bz2
- gcc2 is not my friend, given that it can't deal with friend declarations
properly :) (a.k.a: make it compile with gcc2, step 2)
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
@@ -128,52 +128,57 @@ 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;
}
@@ -184,17 +189,17 @@ void Thread::start()
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 );
}
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
@@ -21,21 +21,16 @@
#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();
@@ -83,17 +78,16 @@ namespace ThreadUtil
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();