source: XmlTools2/trunk/libs/TinyJS_Threading.cpp@ 908

Last change on this file since 908 was 906, checked in by s10k, 11 years ago
File size: 2.2 KB
Line 
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
28class CScriptMutex_impl : public CScriptMutex::CScriptMutex_t {
29public:
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
45CScriptMutex::CScriptMutex() {
46 mutex = new CScriptMutex_impl;
47}
48
49CScriptMutex::~CScriptMutex() {
50 delete mutex;
51}
52
53class CScriptThread_impl : public CScriptThread::CScriptThread_t {
54public:
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
82CScriptThread::CScriptThread() {
83 thread = new CScriptThread_impl(this);
84}
85CScriptThread::~CScriptThread() {
86 delete thread;
87}
88#endif // HAVE_THREADING
Note: See TracBrowser for help on using the repository browser.