0
|
1 #ifndef _VIS_THREADING_H_
|
|
2 #define _VIS_THREADING_H_
|
|
3
|
|
4 #ifndef COMPILE_THREADS
|
|
5 #ifdef NO_THREADS
|
|
6 #define COMPILE_THREADS 1
|
|
7 #else
|
|
8 #define COMPILE_THREADS 4
|
|
9 #endif
|
|
10 #endif
|
|
11
|
|
12 #if COMPILE_THREADS > 1
|
|
13
|
|
14 #ifdef WIN32
|
|
15
|
|
16 #include "windows.h"
|
|
17 /*
|
|
18 __inline void VIS_EnterCriticalSectionImpl(short * cs)
|
|
19 {
|
|
20 int tmp = (int)cs;
|
|
21 __asm
|
|
22 {
|
|
23 mov ebx, tmp
|
|
24 CriticalLoop:
|
|
25 bts [ebx], 0
|
|
26 jnc End
|
|
27 }
|
|
28 Sleep(0);
|
|
29 __asm
|
|
30 {
|
|
31 jmp CriticalLoop
|
|
32 }
|
|
33
|
|
34 End:
|
|
35 return;
|
|
36 }*/
|
|
37
|
|
38 extern int lock_fail_counter;
|
|
39 extern int lock_counter;
|
|
40 extern int spin_counter;
|
|
41
|
|
42 volatile __inline void VIS_EnterCriticalSectionImpl(short * cs)
|
|
43 {
|
|
44 int tmp = (int)cs;
|
|
45 //int spins = 0;
|
|
46 __asm
|
|
47 {
|
|
48 mov ebx, tmp
|
|
49 CriticalLoop:
|
|
50 mov ax, 1
|
|
51 xchg ax, [ebx]
|
|
52 test ax, ax
|
|
53
|
|
54
|
|
55 jz End
|
|
56 }
|
|
57 //++spins;
|
|
58 Sleep(0);
|
|
59 __asm
|
|
60 {
|
|
61 jmp CriticalLoop
|
|
62 }
|
|
63
|
|
64 End:
|
|
65 /* if(spins > 0)
|
|
66 {
|
|
67 tmp = (int)(&lock_fail_counter);
|
|
68 __asm
|
|
69 {
|
|
70 mov ebx, tmp
|
|
71 lock inc dword ptr [ebx]
|
|
72 }
|
|
73 tmp = (int)(&spin_counter);
|
|
74 __asm
|
|
75 {
|
|
76 mov ebx, tmp
|
|
77 mov eax, spins
|
|
78 lock xadd dword ptr [ebx], eax
|
|
79 }
|
|
80 }
|
|
81 tmp = (int)(&lock_counter);
|
|
82 __asm
|
|
83 {
|
|
84 mov ebx, tmp
|
|
85 lock inc dword ptr [ebx]
|
|
86 }*/
|
|
87 return;
|
|
88 }
|
|
89
|
|
90 volatile __inline void VIS_LeaveCriticalSectionImpl(short * cs)
|
|
91 {
|
|
92 int tmp = (int)cs;
|
|
93 __asm
|
|
94 {
|
|
95 mov ebx, tmp
|
|
96 mov ax, 0
|
|
97 xchg ax, [ebx]
|
|
98 }
|
|
99 }
|
|
100 #else
|
|
101 /*
|
|
102 #include <unistd.h>
|
|
103
|
|
104 volatile inline void VIS_EnterCriticalSectionImpl(short * cs)
|
|
105 {
|
|
106 int code;
|
|
107 VIS_EnterStart:
|
|
108 asm(
|
|
109 "movw $1, %%ax\n\t"
|
|
110 "xchg %%ax, (%1)\n\t"
|
|
111 "test %%ax, %%ax\n\t"
|
|
112 "jz VIS_EnterEnd\n\t"
|
|
113 "movl $1, %0\n\t"
|
|
114 "jmp VIS_EnterCont\n"
|
|
115 "VIS_EnterEnd:\n\t"
|
|
116 "movl $0, %0\n"
|
|
117 "VIS_EnterCont:":
|
|
118 "=r"(code):
|
|
119 "r"(cs):
|
|
120 "%ax");
|
|
121 if(!code)
|
|
122 return;
|
|
123 sleep(0);
|
|
124 goto VIS_EnterStart;
|
|
125 }
|
|
126
|
|
127 volatile inline void VIS_LeaveCriticalSectionImpl(short * cs)
|
|
128 {
|
|
129 asm(
|
|
130 "movw $0, %%ax\n\t"
|
|
131 "mfence\n\t"
|
|
132 "xchg %%ax, (%0)"::
|
|
133 "r"(cs):
|
|
134 "%ax");
|
|
135 }*/
|
|
136 #ifdef CPLUSPLUS
|
|
137 extern "C" {
|
|
138 #endif
|
|
139 volatile void VIS_EnterCriticalSectionImpl(short * cs);
|
|
140 volatile void VIS_LeaveCriticalSectionImpl(short * cs);
|
|
141
|
|
142 #ifdef CPLUSPLUS
|
|
143 }
|
|
144 #endif
|
|
145
|
|
146 #endif //Win32
|
|
147
|
|
148 #ifdef USE_OS_PRIMITIVES
|
|
149 #ifdef WIN32
|
|
150 //TODO fill this in
|
|
151 #else
|
|
152 #ifdef SYLLABLE
|
|
153 //TODO fill this in
|
|
154 #else
|
|
155 #include <pthread.h>
|
|
156 #define VIS_CRITICAL_SECTION(cs) pthread_mutex_t cs;
|
|
157 #define VIS_EXTERN_CRITICAL_SECTION(cs) extern pthread_mutex_t cs;
|
|
158 #define VIS_InitializeCriticalSection(cs) pthread_mutex_init(&(cs), NULL)
|
|
159 #define VIS_EnterCriticalSection(cs) pthread_mutex_lock(&(cs))
|
|
160 #define VIS_LeaveCriticalSection(cs) pthread_mutex_unlock(&(cs))
|
|
161 #define VIS_DeleteCriticalSection(cs) pthread_mutex_destroy(&(cs))
|
|
162 #endif //SYLLABLE
|
|
163 #endif //WIN32
|
|
164 #else
|
|
165 #define VIS_CRITICAL_SECTION(cs) short cs;//CRITICAL_SECTION cs;//
|
|
166 #define VIS_EXTERN_CRITICAL_SECTION(cs) extern short cs;
|
|
167 #define VIS_InitializeCriticalSection(cs) cs = 0
|
|
168 #define VIS_EnterCriticalSection(cs) VIS_EnterCriticalSectionImpl(&(cs))
|
|
169 #define VIS_LeaveCriticalSection(cs) cs = 0//VIS_LeaveCriticalSectionImpl(&(cs))
|
|
170 #define VIS_DeleteCriticalSection(cs)
|
|
171 #endif/*
|
|
172 #define VIS_InitializeCriticalSection(cs) InitializeCriticalSectionAndSpinCount(&(cs),0x400);
|
|
173 #define VIS_EnterCriticalSection(cs) EnterCriticalSection(&(cs))
|
|
174 #define VIS_LeaveCriticalSection(cs) LeaveCriticalSection(&(cs))
|
|
175 #define VIS_DeleteCriticalSection(cs) DeleteCriticalSection(&(cs))*/
|
|
176
|
|
177 #ifdef WIN32
|
|
178
|
|
179 #define VIS_Event(evt) HANDLE evt;
|
|
180 #define VIS_CreateEvent(evt) evt = CreateEvent(NULL, TRUE, FALSE, NULL)
|
|
181 #define VIS_DestroyEvent(evt) CloseHandle(evt)
|
|
182 #define VIS_SetEvent(evt) SetEvent(evt)
|
|
183 #define VIS_ResetEvent(evt) ResetEvent(evt)
|
|
184 #define VIS_WaitEvent(evt) WaitForSingleObject(evt, INFINITE)
|
|
185
|
|
186 #else
|
|
187 #ifdef SYLLABLE
|
|
188 //TODO fill this in
|
|
189 #define VIS_Event(evt)
|
|
190 #define VIS_CreateEvent(evt)
|
|
191 #define VIS_DestroyEvent(evt)
|
|
192 #define VIS_SetEvent(evt)
|
|
193 #define VIS_ResetEvent(evt)
|
|
194 #define VIS_WaitEvent(evt) sleep(0)
|
|
195 #else
|
|
196 #define VIS_Event(evt) pthread_cond_t evt; pthread_mutex_t evt##_mutex;
|
|
197 #define VIS_CreateEvent(evt) pthread_cond_init(&(evt), NULL); pthread_mutex_init(&(evt##_mutex),NULL)
|
|
198 #define VIS_DestroyEvent(evt) pthread_cond_destroy(&(evt)); pthread_mutex_destroy(&(evt##_mutex))
|
|
199 #define VIS_SetEvent(evt) pthread_mutex_lock(&(evt##_mutex)); pthread_cond_signal(&(evt)); pthread_mutex_unlock(&evt##_mutex);
|
|
200 #define VIS_ResetEvent(evt)
|
|
201 #define VIS_WaitEvent(evt) pthread_mutex_lock(&(evt##_mutex)); pthread_cond_wait(&(evt), &(evt##_mutex)); pthread_mutex_unlock(&evt##_mutex)
|
|
202 #endif //SYLLABLE
|
|
203 #endif //WIN32
|
|
204
|
|
205 #ifdef WIN32
|
|
206 #define VIS_NewThread(func, data) CreateThread(NULL, 0, func, data, 0, NULL)
|
|
207 #else
|
|
208 #ifdef SYLLABLE
|
|
209 #define VIS_NewThread(func, data) resume_thread(spawn_thread("vis_worker", func, 1, 0, data));
|
|
210 #else
|
|
211 #include <pthread.h>
|
|
212 pthread_t pid;
|
|
213 #define VIS_NewThread(func, data) pthread_create(&pid, NULL, func, data);
|
|
214 #endif
|
|
215 #endif
|
|
216
|
|
217 #else
|
|
218
|
|
219 #define VIS_CRITICAL_SECTION(cs)
|
|
220 #define VIS_EXTERN_CRITICAL_SECTION(cs)
|
|
221 #define VIS_InitializeCriticalSection(cs)
|
|
222 #define VIS_EnterCriticalSection(cs)
|
|
223 #define VIS_LeaveCriticalSection(cs)
|
|
224 #define VIS_DeleteCriticalSection(cs)
|
|
225
|
|
226 #define VIS_Event(evt)
|
|
227 #define VIS_CreateEvent(evt)
|
|
228 #define VIS_DestroyEvent(evt)
|
|
229 #define VIS_SetEvent(evt)
|
|
230 #define VIS_WaitEvent(evt)
|
|
231 #define VIS_ResetEvent(evt)
|
|
232 #define VIS_NewThread(func, data)
|
|
233
|
|
234 #endif //COMPILE_THREADS > 1
|
|
235
|
|
236
|
|
237 #endif //_VIS_THREADING_H_
|
|
238
|
|
239
|
|
240
|
|
241
|
|
242
|