-rw-r--r-- | noncore/multimedia/opieplayer2/threadutil.cpp | 14 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/threadutil.h | 5 |
2 files changed, 9 insertions, 10 deletions
diff --git a/noncore/multimedia/opieplayer2/threadutil.cpp b/noncore/multimedia/opieplayer2/threadutil.cpp index a5cc92d..7a9e1a4 100644 --- a/noncore/multimedia/opieplayer2/threadutil.cpp +++ b/noncore/multimedia/opieplayer2/threadutil.cpp @@ -117,64 +117,64 @@ void WaitCondition::wakeOne() { pthread_cond_signal( &d->waitCondition ); } void WaitCondition::wakeAll() { pthread_cond_broadcast( &d->waitCondition ); } struct Thread::Data { Data() : isRunning( false ) {} pthread_t self; Mutex guard; bool isRunning; WaitCondition finishCondition; }; extern "C" { -void _threadutil_terminate_thread( void *arg ) +static void terminate_thread( void *arg ) { - Thread *thr = ( Thread* )arg; + Thread::Data *data = ( Thread::Data* )arg; - assert( thr ); + assert( data ); - AutoLock locker( thr->d->guard ); - thr->d->isRunning = false; - thr->d->finishCondition.wakeAll(); + AutoLock locker( data->guard ); + data->isRunning = false; + data->finishCondition.wakeAll(); } void *_threadutil_start_thread( void *arg ) { Thread *thr = ( Thread* )arg; - pthread_cleanup_push( _threadutil_terminate_thread, thr ); + pthread_cleanup_push( terminate_thread, thr->d ); thr->d->isRunning = true; thr->run(); pthread_cleanup_pop( true ); Thread::exit(); return 0; // never reached } } Thread::Thread() : d( new Data ) { } Thread::~Thread() { assert( d->isRunning == false ); delete d; } void Thread::start() diff --git a/noncore/multimedia/opieplayer2/threadutil.h b/noncore/multimedia/opieplayer2/threadutil.h index b67b61d..21ae6b2 100644 --- a/noncore/multimedia/opieplayer2/threadutil.h +++ b/noncore/multimedia/opieplayer2/threadutil.h @@ -8,49 +8,48 @@ This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 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* ); - void _threadutil_terminate_thread( void* ); } namespace ThreadUtil { class Mutex { friend class WaitCondition; public: Mutex(); ~Mutex(); void lock(); void unlock(); bool tryLock(); bool isLocked(); private: struct Data; Data *d; Mutex( const Mutex & ); Mutex &operator=( const Mutex & ); }; @@ -69,66 +68,66 @@ namespace ThreadUtil class WaitCondition { public: WaitCondition(); ~WaitCondition(); bool wait(); bool wait( Mutex &mutex ); void wakeOne(); void wakeAll(); private: struct Data; Data *d; WaitCondition( const WaitCondition & ); WaitCondition &operator=( const WaitCondition & ); }; class Thread { friend void *::_threadutil_start_thread( void* ); - friend void ::_threadutil_terminate_thread( void* ); public: + struct Data; + Thread(); virtual ~Thread(); void start(); void terminate(); bool wait(); bool isRunning() const; static void exit(); protected: virtual void run() = 0; private: - struct Data; Data *d; }; class OnewayNotifier : public QObject { Q_OBJECT public: OnewayNotifier(); ~OnewayNotifier(); void notify(); signals: void awake(); private slots: void wakeUp(); private: int m_readFd; int m_writeFd; QSocketNotifier *m_notifier; }; |