trunk 20080912
[gitenigma.git] / lib / base / thread.cpp
blob962253e64cc4b9a561770bfe6400b3096d17e645
1 #include <lib/base/thread.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <lib/base/eerror.h>
7 void eThread::thread_completed(void *ptr)
9 eThread *p = (eThread*) ptr;
10 eDebug("thread has completed..");
11 p->alive=0;
12 p->thread_finished();
15 void *eThread::wrapper(void *ptr)
17 eThread *p = (eThread*)ptr;
18 pthread_cleanup_push( thread_completed, (void*)p );
19 p->thread();
20 pthread_exit(0);
21 pthread_cleanup_pop(1);
22 return 0;
25 eThread::eThread()
26 :the_thread(0), alive(0)
30 void eThread::run( int prio, int policy )
32 if (alive)
34 eDebug("thread already running !!");
35 return;
37 pthread_attr_t attr;
38 pthread_attr_init(&attr);
39 if (prio||policy)
41 struct sched_param p;
42 p.__sched_priority=prio;
43 pthread_attr_setschedpolicy(&attr, policy );
44 pthread_attr_setschedparam(&attr, &p);
46 if ( pthread_create(&the_thread, &attr, wrapper, this) )
48 eDebug("couldn't create new thread");
49 return;
51 alive = 1;
54 eThread::~eThread()
56 kill();
59 void eThread::kill(bool sendcancel)
61 if (!the_thread)
62 return;
63 if ( alive && sendcancel )
65 eDebug("send cancel to thread");
66 pthread_cancel(the_thread);
68 eDebug("thread joined %d", pthread_join(the_thread, 0));
69 the_thread=0;