ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/XmlTools2/trunk/libs/TinyJS_Threading.cpp
Revision: 906
Committed: Sat Feb 1 14:27:58 2014 UTC (11 years, 8 months ago) by s10k
Content type: text/x-c++src
File size: 2258 byte(s)
Log Message:

File Contents

# Content
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