1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
#if !defined(__WXMSW__)
#include "ethread_unix.h"
#include "ethread.h"
static void *startFunc(void* arg)
{
eThread *thread = reinterpret_cast<eThread*>(arg);
if(thread) {
// call the thread main loop
thread->start();
}
// terminate the thread
pthread_exit(0);
return 0;
}
eThreadImpl::eThreadImpl()
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutex_init( &m_cancelMutex, &attr );
// lock the mutex, this will be used as flag in testDestroy()
pthread_mutex_lock( &m_cancelMutex );
}
eThreadImpl::~eThreadImpl()
{
}
void eThreadImpl::run(eThread *thread)
{
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&m_tid, &attr,
&startFunc, // entry point
thread);
}
bool eThreadImpl::testDestroy()
{
return pthread_mutex_trylock(&m_cancelMutex) == 0;
}
void eThreadImpl::requestStop()
{
// unlock the cancellation mutex
pthread_mutex_unlock(&m_cancelMutex);
}
void eThreadImpl::wait(long timeout)
{
void *exit_code;
pthread_join(m_tid, &exit_code);
}
#endif // __WXMSW__
|