File: ethread_unix.cpp

package info (click to toggle)
codelite 12.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 95,112 kB
  • sloc: cpp: 424,040; ansic: 18,284; php: 9,569; lex: 4,186; yacc: 2,820; python: 2,294; sh: 312; makefile: 51; xml: 13
file content (62 lines) | stat: -rw-r--r-- 1,135 bytes parent folder | download | duplicates (5)
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__