1 /*
2 * UAE - The Un*x Amiga Emulator
3 *
4 * Threading support, using pthreads
5 *
6 * Copyright 1997 Bernd Schmidt
7 * Copyright 2004 Richard Drummond
8 */
9 #ifdef _WIN32
10
11 #define WIN32_LEAN_AND_MEAN
12 typedef HANDLE uae_sem_t;
13 typedef HANDLE uae_thread_id;
14
15 extern void uae_sem_destroy (uae_sem_t*);
16 extern int uae_sem_trywait (uae_sem_t*);
17 extern void uae_sem_post (uae_sem_t*);
18 extern void uae_sem_wait (uae_sem_t*t);
19 extern void uae_sem_init (uae_sem_t*, int manual_reset, int initial_state);
20 extern int uae_start_thread (const TCHAR *name, void *(*f)(void *), void *arg, uae_thread_id *thread);
21 extern int uae_start_thread_fast (void *(*f)(void *), void *arg, uae_thread_id *thread);
22 extern void uae_end_thread (uae_thread_id *thread);
23 extern void uae_set_thread_priority (uae_thread_id */*, int*/);
24
25 #include "commpipe.h"
26
uae_wait_thread(uae_thread_id tid)27 STATIC_INLINE void uae_wait_thread (uae_thread_id tid)
28 {
29 WaitForSingleObject (tid, INFINITE);
30 CloseHandle (tid);
31 }
32 #else //win32
33
34 #ifdef WIIU
35 //FIXME: write using wiiu semaphore
36 #warning WIIU bad Hack rewrite me
37
38 #define TESTSEM 1
39
40 #include <wiiu_pthread.h>
41 #include <wiiu/os/semaphore.h>
42
43 typedef struct {
44 OSSemaphore *sem;
45 } uae_sem_t;
46
uae_sem_init(uae_sem_t * sem,int pshared,unsigned int value)47 STATIC_INLINE int uae_sem_init (uae_sem_t *sem, int pshared, unsigned int value)
48 {
49 #ifdef TESTSEM
50 sem->sem = (OSSemaphore *) malloc(sizeof(OSSemaphore));
51 if ( sem->sem ) {
52 OSInitSemaphore(sem->sem,value);
53
54 } else {
55 printf("init sema failed\n");
56 return 1;
57 }
58 #else
59 return 0;
60 #endif
61 }
62
uae_sem_destroy(uae_sem_t * sem)63 STATIC_INLINE int uae_sem_destroy (uae_sem_t *sem)
64 {
65 #ifdef TESTSEM
66
67 if ( sem->sem ) {
68 free(sem->sem);
69 }
70 return 0;
71 #else
72 return 0;
73 #endif
74 }
75
uae_sem_post(uae_sem_t * sem)76 STATIC_INLINE int uae_sem_post (uae_sem_t *sem)
77 {
78 #ifdef TESTSEM
79
80
81 int retval;
82
83 if ( ! sem->sem ) {
84 printf("Passed a NULL semaphore");
85 return -1;
86 }
87
88 retval = OSSignalSemaphore(sem->sem);
89 if ( retval < 0 ) {
90 printf("sem_post() failed");
91 }
92 return retval;
93
94 #else
95 return -1;
96 #endif
97 }
98
uae_sem_wait(uae_sem_t * sem)99 STATIC_INLINE int uae_sem_wait (uae_sem_t *sem)
100 {
101 #ifdef TESTSEM
102
103 int retval;
104
105 if ( ! sem->sem ) {
106 printf("Passed a NULL semaphore");
107 return -1;
108 }
109
110 while ( ((retval = OSWaitSemaphore(sem->sem)) == -1) ) {}
111 if ( retval < 0 ) {
112 printf("sem_wait() failed");
113 }
114 return retval;
115
116 #else
117 return -1;
118 #endif
119 }
120
uae_sem_trywait(uae_sem_t * sem)121 STATIC_INLINE int uae_sem_trywait (uae_sem_t *sem)
122 {
123 #ifdef TESTSEM
124 int retval;
125
126 if ( ! sem->sem ) {
127 printf("Passed a NULL semaphore");
128 return -1;
129 }
130 retval = 1;
131 if ( OSTryWaitSemaphore (sem->sem) == 0 ) {
132 retval = 0;
133 }
134 return retval;
135 #else
136 return -1;
137 #endif
138 }
139
uae_sem_getvalue(uae_sem_t * sem,int * sval)140 STATIC_INLINE int uae_sem_getvalue (uae_sem_t *sem, int *sval)
141 {
142 #ifdef TESTSEM
143 if ( ! sem->sem ) {
144 printf("Passed a NULL semaphore");
145 return -1;
146 }
147 return OSGetSemaphoreCount (sem->sem);
148 #else
149 return -1;
150 #endif
151 }
152
153
154 #else // WIIU
155
156 #include <pthread.h>
157 #include <semaphore.h>
158
159
160 typedef struct {
161 sem_t *sem;
162 } uae_sem_t;
163
164 #ifndef USE_NAMED_SEMAPHORES
165
166 int uae_sem_init (uae_sem_t *sem, int pshared, unsigned int value);
167
uae_sem_destroy(uae_sem_t * sem)168 STATIC_INLINE int uae_sem_destroy (uae_sem_t *sem)
169 {
170 return sem_destroy (sem->sem);
171 }
172
uae_sem_post(uae_sem_t * sem)173 STATIC_INLINE int uae_sem_post (uae_sem_t *sem)
174 {
175 return sem_post (sem->sem);
176 }
177
uae_sem_wait(uae_sem_t * sem)178 STATIC_INLINE int uae_sem_wait (uae_sem_t *sem)
179 {
180 return sem_wait (sem->sem);
181 }
182
uae_sem_trywait(uae_sem_t * sem)183 STATIC_INLINE int uae_sem_trywait (uae_sem_t *sem)
184 {
185 return sem_trywait (sem->sem);
186 }
187
uae_sem_getvalue(uae_sem_t * sem,int * sval)188 STATIC_INLINE int uae_sem_getvalue (uae_sem_t *sem, int *sval)
189 {
190 return sem_getvalue (sem->sem, sval);
191 }
192
193 #else
194
195 int uae_sem_init (uae_sem_t *sem, int pshared, unsigned int value);
196
uae_sem_destroy(uae_sem_t * sem)197 STATIC_INLINE int uae_sem_destroy (uae_sem_t *sem)
198 {
199 return sem->sem == 0 ? -1 : sem_close (sem->sem);
200 }
201
uae_sem_post(uae_sem_t * sem)202 STATIC_INLINE int uae_sem_post (uae_sem_t *sem)
203 {
204 return sem->sem == 0 ? -1 : sem_post (sem->sem);
205 }
206
uae_sem_wait(uae_sem_t * sem)207 STATIC_INLINE int uae_sem_wait (uae_sem_t *sem)
208 {
209 return sem->sem == 0 ? -1 : sem_wait (sem->sem);
210 }
211
uae_sem_trywait(uae_sem_t * sem)212 STATIC_INLINE int uae_sem_trywait (uae_sem_t *sem) {
213 return sem->sem == 0 ? -1 : sem_trywait (sem->sem);
214 }
215
uae_sem_getvalue(uae_sem_t * sem,int * sval)216 STATIC_INLINE int uae_sem_getvalue (uae_sem_t *sem, int *sval)
217 {
218 return sem->sem == 0 ? -1 : sem_getvalue (sem->sem, sval);
219 }
220
221 #endif
222
223 #endif
224
225 #include "commpipe.h"
226
227 typedef pthread_t uae_thread_id;
228 #define BAD_THREAD 0
229
uae_start_thread(char * name,void * (* f)(void *),void * arg,uae_thread_id * foo)230 STATIC_INLINE int uae_start_thread (char *name, void *(*f) (void *), void *arg, uae_thread_id *foo)
231 {
232 int result;
233 result = pthread_create (foo, 0, f, arg);
234
235 return 0 == result;
236 }
237
uae_wait_thread(uae_thread_id thread)238 STATIC_INLINE int uae_wait_thread (uae_thread_id thread)
239 {
240 return pthread_join (thread, (void**)0);
241 }
242
uae_kill_thread(uae_thread_id * thread)243 STATIC_INLINE void uae_kill_thread (uae_thread_id* thread)
244 {
245 pthread_detach(*thread);
246 }
247
248
249 #define UAE_THREAD_EXIT pthread_exit(0)
250
251 #define uae_set_thread_priority(pri)
252
253 #endif
254