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