From 62b8a649fcae500c983215fac2e5202916c0195f Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Wed, 8 Jun 2005 12:38:15 +0000 Subject: merge some code with enigma code --- lib/base/thread.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 15 deletions(-) (limited to 'lib/base/thread.cpp') diff --git a/lib/base/thread.cpp b/lib/base/thread.cpp index b75378b8..fa09691a 100644 --- a/lib/base/thread.cpp +++ b/lib/base/thread.cpp @@ -1,40 +1,87 @@ #include + #include +#include #include +void eThread::thread_completed(void *ptr) +{ + eThread *p = (eThread*) ptr; + eDebug("thread has completed.."); + p->alive=0; + p->thread_finished(); +} + void *eThread::wrapper(void *ptr) { - ((eThread*)ptr)->thread(); + eThread *p = (eThread*)ptr; + p->alive=1; + pthread_cleanup_push( thread_completed, (void*)p ); + p->thread(); pthread_exit(0); + pthread_cleanup_pop(0); } eThread::eThread() + :alive(0) { - alive=0; } -void eThread::run() +void eThread::run( int prio, int policy ) { - alive=1; - pthread_create(&the_thread, 0, wrapper, this); -} + pthread_attr_t attr; + pthread_attr_init(&attr); + if (prio||policy) + { + struct sched_param p; + p.__sched_priority=prio; + pthread_attr_setschedpolicy(&attr, policy ); + pthread_attr_setschedparam(&attr, &p); + } + pthread_create(&the_thread, &attr, wrapper, this); + usleep(1000); + int timeout=20; + while(!alive && timeout--) + { + eDebug("waiting for thread start..."); + usleep(1000*10); + } + if ( !timeout ) + eDebug("thread couldn't be started !!!"); +} eThread::~eThread() { - if (alive) + if ( alive ) kill(); } -void eThread::kill() +void eThread::sendSignal(int sig) { - alive=0; - eDebug("waiting for thread shutdown"); - pthread_join(the_thread, 0); - eDebug("ok"); + if ( alive ) + pthread_kill( the_thread, sig ); + else + eDebug("send signal to non running thread"); } -void eThread::sendSignal(int sig) +void eThread::kill(bool hard) { - if (alive) - pthread_kill(the_thread, sig); + if ( !alive ) + { + eDebug("kill.. but thread don't running"); + return; + } + + if ( hard ) + { + eDebug("killing the thread..."); + pthread_cancel(the_thread); + alive=0; + } + else + { + eDebug("waiting for thread shutdown..."); + pthread_join(the_thread, 0); + eDebug("ok"); + } } -- cgit v1.2.3