1 |
#include "TinyJS_Threading.h" |
2 |
|
3 |
#undef HAVE_THREADING |
4 |
#if !defined(NO_THREADING) && !defined(HAVE_CUSTOM_THREADING_IMPL) |
5 |
# define HAVE_THREADING |
6 |
# if defined(WIN32) && !defined(HAVE_PTHREAD) |
7 |
# include <windows.h> |
8 |
# else |
9 |
# include <pthread.h> |
10 |
# endif |
11 |
#endif |
12 |
|
13 |
#ifdef HAVE_THREADING |
14 |
|
15 |
#ifndef HAVE_PTHREAD |
16 |
// simple pthreads 4 windows |
17 |
# define pthread_t HANDLE |
18 |
# define pthread_create(t, stack, fnc, a) *(t) = CreateThread(NULL, stack, (LPTHREAD_START_ROUTINE)fnc, a, 0, NULL) |
19 |
# define pthread_join(t, v) WaitForSingleObject(t, INFINITE), GetExitCodeThread(t,(LPDWORD)v), CloseHandle(t) |
20 |
|
21 |
# define pthread_mutex_t HANDLE |
22 |
# define pthread_mutex_init(m, a) *(m) = CreateMutex(NULL, false, NULL) |
23 |
# define pthread_mutex_destroy(m) CloseHandle(*(m)); |
24 |
# define pthread_mutex_lock(m) WaitForSingleObject(*(m), INFINITE); |
25 |
# define pthread_mutex_unlock(m) ReleaseMutex(*(m)); |
26 |
#endif |
27 |
|
28 |
class CScriptMutex_impl : public CScriptMutex::CScriptMutex_t { |
29 |
public: |
30 |
CScriptMutex_impl() { |
31 |
pthread_mutex_init(&mutex, NULL); |
32 |
} |
33 |
~CScriptMutex_impl() { |
34 |
pthread_mutex_destroy(&mutex); |
35 |
} |
36 |
void lock() { |
37 |
pthread_mutex_lock(&mutex); |
38 |
} |
39 |
void unlock() { |
40 |
pthread_mutex_unlock(&mutex); |
41 |
} |
42 |
pthread_mutex_t mutex; |
43 |
}; |
44 |
|
45 |
CScriptMutex::CScriptMutex() { |
46 |
mutex = new CScriptMutex_impl; |
47 |
} |
48 |
|
49 |
CScriptMutex::~CScriptMutex() { |
50 |
delete mutex; |
51 |
} |
52 |
|
53 |
class CScriptThread_impl : public CScriptThread::CScriptThread_t { |
54 |
public: |
55 |
CScriptThread_impl(CScriptThread *_this) : activ(false), running(false), This(_this) {} |
56 |
~CScriptThread_impl() {} |
57 |
void Run() { |
58 |
if(running) return; |
59 |
activ = true; |
60 |
pthread_create(&thread, NULL, (void*(*)(void*))ThreadFnc, this); |
61 |
while(!running); |
62 |
} |
63 |
int Stop() { |
64 |
if(!running) return -1; |
65 |
void *retvar; |
66 |
activ = false; |
67 |
pthread_join(thread, &retvar); |
68 |
running = false; |
69 |
return (int)retvar; |
70 |
} |
71 |
bool isActiv() { return activ; } |
72 |
static void *ThreadFnc(CScriptThread_impl *This) { |
73 |
This->running = true; |
74 |
return (void*) This->This->ThreadFnc(); |
75 |
} |
76 |
bool activ; |
77 |
bool running; |
78 |
CScriptThread *This; |
79 |
pthread_t thread; |
80 |
}; |
81 |
|
82 |
CScriptThread::CScriptThread() { |
83 |
thread = new CScriptThread_impl(this); |
84 |
} |
85 |
CScriptThread::~CScriptThread() { |
86 |
delete thread; |
87 |
} |
88 |
#endif // HAVE_THREADING |