1*e4b17023SJohn Marino /* Threads compatibility routines for libgcc2 and libobjc. */
2*e4b17023SJohn Marino /* Compile this one with gcc. */
3*e4b17023SJohn Marino /* Copyright (C) 1997, 1999, 2000, 2004, 2008, 2009
4*e4b17023SJohn Marino Free Software Foundation, Inc.
5*e4b17023SJohn Marino
6*e4b17023SJohn Marino This file is part of GCC.
7*e4b17023SJohn Marino
8*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
9*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
10*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
11*e4b17023SJohn Marino version.
12*e4b17023SJohn Marino
13*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
15*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16*e4b17023SJohn Marino for more details.
17*e4b17023SJohn Marino
18*e4b17023SJohn Marino Under Section 7 of GPL version 3, you are granted additional
19*e4b17023SJohn Marino permissions described in the GCC Runtime Library Exception, version
20*e4b17023SJohn Marino 3.1, as published by the Free Software Foundation.
21*e4b17023SJohn Marino
22*e4b17023SJohn Marino You should have received a copy of the GNU General Public License and
23*e4b17023SJohn Marino a copy of the GCC Runtime Library Exception along with this program;
24*e4b17023SJohn Marino see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */
26*e4b17023SJohn Marino
27*e4b17023SJohn Marino #ifndef GCC_GTHR_SINGLE_H
28*e4b17023SJohn Marino #define GCC_GTHR_SINGLE_H
29*e4b17023SJohn Marino
30*e4b17023SJohn Marino /* Just provide compatibility for mutex handling. */
31*e4b17023SJohn Marino
32*e4b17023SJohn Marino typedef int __gthread_key_t;
33*e4b17023SJohn Marino typedef int __gthread_once_t;
34*e4b17023SJohn Marino typedef int __gthread_mutex_t;
35*e4b17023SJohn Marino typedef int __gthread_recursive_mutex_t;
36*e4b17023SJohn Marino
37*e4b17023SJohn Marino #define __GTHREAD_ONCE_INIT 0
38*e4b17023SJohn Marino #define __GTHREAD_MUTEX_INIT 0
39*e4b17023SJohn Marino #define __GTHREAD_RECURSIVE_MUTEX_INIT 0
40*e4b17023SJohn Marino
41*e4b17023SJohn Marino #define UNUSED __attribute__((unused))
42*e4b17023SJohn Marino
43*e4b17023SJohn Marino #ifdef _LIBOBJC
44*e4b17023SJohn Marino
45*e4b17023SJohn Marino /* Thread local storage for a single thread */
46*e4b17023SJohn Marino static void *thread_local_storage = NULL;
47*e4b17023SJohn Marino
48*e4b17023SJohn Marino /* Backend initialization functions */
49*e4b17023SJohn Marino
50*e4b17023SJohn Marino /* Initialize the threads subsystem. */
51*e4b17023SJohn Marino static inline int
__gthread_objc_init_thread_system(void)52*e4b17023SJohn Marino __gthread_objc_init_thread_system (void)
53*e4b17023SJohn Marino {
54*e4b17023SJohn Marino /* No thread support available */
55*e4b17023SJohn Marino return -1;
56*e4b17023SJohn Marino }
57*e4b17023SJohn Marino
58*e4b17023SJohn Marino /* Close the threads subsystem. */
59*e4b17023SJohn Marino static inline int
__gthread_objc_close_thread_system(void)60*e4b17023SJohn Marino __gthread_objc_close_thread_system (void)
61*e4b17023SJohn Marino {
62*e4b17023SJohn Marino /* No thread support available */
63*e4b17023SJohn Marino return -1;
64*e4b17023SJohn Marino }
65*e4b17023SJohn Marino
66*e4b17023SJohn Marino /* Backend thread functions */
67*e4b17023SJohn Marino
68*e4b17023SJohn Marino /* Create a new thread of execution. */
69*e4b17023SJohn Marino static inline objc_thread_t
__gthread_objc_thread_detach(void (* func)(void *),void * arg UNUSED)70*e4b17023SJohn Marino __gthread_objc_thread_detach (void (* func)(void *), void * arg UNUSED)
71*e4b17023SJohn Marino {
72*e4b17023SJohn Marino /* No thread support available */
73*e4b17023SJohn Marino return NULL;
74*e4b17023SJohn Marino }
75*e4b17023SJohn Marino
76*e4b17023SJohn Marino /* Set the current thread's priority. */
77*e4b17023SJohn Marino static inline int
__gthread_objc_thread_set_priority(int priority UNUSED)78*e4b17023SJohn Marino __gthread_objc_thread_set_priority (int priority UNUSED)
79*e4b17023SJohn Marino {
80*e4b17023SJohn Marino /* No thread support available */
81*e4b17023SJohn Marino return -1;
82*e4b17023SJohn Marino }
83*e4b17023SJohn Marino
84*e4b17023SJohn Marino /* Return the current thread's priority. */
85*e4b17023SJohn Marino static inline int
__gthread_objc_thread_get_priority(void)86*e4b17023SJohn Marino __gthread_objc_thread_get_priority (void)
87*e4b17023SJohn Marino {
88*e4b17023SJohn Marino return OBJC_THREAD_INTERACTIVE_PRIORITY;
89*e4b17023SJohn Marino }
90*e4b17023SJohn Marino
91*e4b17023SJohn Marino /* Yield our process time to another thread. */
92*e4b17023SJohn Marino static inline void
__gthread_objc_thread_yield(void)93*e4b17023SJohn Marino __gthread_objc_thread_yield (void)
94*e4b17023SJohn Marino {
95*e4b17023SJohn Marino return;
96*e4b17023SJohn Marino }
97*e4b17023SJohn Marino
98*e4b17023SJohn Marino /* Terminate the current thread. */
99*e4b17023SJohn Marino static inline int
__gthread_objc_thread_exit(void)100*e4b17023SJohn Marino __gthread_objc_thread_exit (void)
101*e4b17023SJohn Marino {
102*e4b17023SJohn Marino /* No thread support available */
103*e4b17023SJohn Marino /* Should we really exit the program */
104*e4b17023SJohn Marino /* exit (&__objc_thread_exit_status); */
105*e4b17023SJohn Marino return -1;
106*e4b17023SJohn Marino }
107*e4b17023SJohn Marino
108*e4b17023SJohn Marino /* Returns an integer value which uniquely describes a thread. */
109*e4b17023SJohn Marino static inline objc_thread_t
__gthread_objc_thread_id(void)110*e4b17023SJohn Marino __gthread_objc_thread_id (void)
111*e4b17023SJohn Marino {
112*e4b17023SJohn Marino /* No thread support, use 1. */
113*e4b17023SJohn Marino return (objc_thread_t) 1;
114*e4b17023SJohn Marino }
115*e4b17023SJohn Marino
116*e4b17023SJohn Marino /* Sets the thread's local storage pointer. */
117*e4b17023SJohn Marino static inline int
__gthread_objc_thread_set_data(void * value)118*e4b17023SJohn Marino __gthread_objc_thread_set_data (void *value)
119*e4b17023SJohn Marino {
120*e4b17023SJohn Marino thread_local_storage = value;
121*e4b17023SJohn Marino return 0;
122*e4b17023SJohn Marino }
123*e4b17023SJohn Marino
124*e4b17023SJohn Marino /* Returns the thread's local storage pointer. */
125*e4b17023SJohn Marino static inline void *
__gthread_objc_thread_get_data(void)126*e4b17023SJohn Marino __gthread_objc_thread_get_data (void)
127*e4b17023SJohn Marino {
128*e4b17023SJohn Marino return thread_local_storage;
129*e4b17023SJohn Marino }
130*e4b17023SJohn Marino
131*e4b17023SJohn Marino /* Backend mutex functions */
132*e4b17023SJohn Marino
133*e4b17023SJohn Marino /* Allocate a mutex. */
134*e4b17023SJohn Marino static inline int
__gthread_objc_mutex_allocate(objc_mutex_t mutex UNUSED)135*e4b17023SJohn Marino __gthread_objc_mutex_allocate (objc_mutex_t mutex UNUSED)
136*e4b17023SJohn Marino {
137*e4b17023SJohn Marino return 0;
138*e4b17023SJohn Marino }
139*e4b17023SJohn Marino
140*e4b17023SJohn Marino /* Deallocate a mutex. */
141*e4b17023SJohn Marino static inline int
__gthread_objc_mutex_deallocate(objc_mutex_t mutex UNUSED)142*e4b17023SJohn Marino __gthread_objc_mutex_deallocate (objc_mutex_t mutex UNUSED)
143*e4b17023SJohn Marino {
144*e4b17023SJohn Marino return 0;
145*e4b17023SJohn Marino }
146*e4b17023SJohn Marino
147*e4b17023SJohn Marino /* Grab a lock on a mutex. */
148*e4b17023SJohn Marino static inline int
__gthread_objc_mutex_lock(objc_mutex_t mutex UNUSED)149*e4b17023SJohn Marino __gthread_objc_mutex_lock (objc_mutex_t mutex UNUSED)
150*e4b17023SJohn Marino {
151*e4b17023SJohn Marino /* There can only be one thread, so we always get the lock */
152*e4b17023SJohn Marino return 0;
153*e4b17023SJohn Marino }
154*e4b17023SJohn Marino
155*e4b17023SJohn Marino /* Try to grab a lock on a mutex. */
156*e4b17023SJohn Marino static inline int
__gthread_objc_mutex_trylock(objc_mutex_t mutex UNUSED)157*e4b17023SJohn Marino __gthread_objc_mutex_trylock (objc_mutex_t mutex UNUSED)
158*e4b17023SJohn Marino {
159*e4b17023SJohn Marino /* There can only be one thread, so we always get the lock */
160*e4b17023SJohn Marino return 0;
161*e4b17023SJohn Marino }
162*e4b17023SJohn Marino
163*e4b17023SJohn Marino /* Unlock the mutex */
164*e4b17023SJohn Marino static inline int
__gthread_objc_mutex_unlock(objc_mutex_t mutex UNUSED)165*e4b17023SJohn Marino __gthread_objc_mutex_unlock (objc_mutex_t mutex UNUSED)
166*e4b17023SJohn Marino {
167*e4b17023SJohn Marino return 0;
168*e4b17023SJohn Marino }
169*e4b17023SJohn Marino
170*e4b17023SJohn Marino /* Backend condition mutex functions */
171*e4b17023SJohn Marino
172*e4b17023SJohn Marino /* Allocate a condition. */
173*e4b17023SJohn Marino static inline int
__gthread_objc_condition_allocate(objc_condition_t condition UNUSED)174*e4b17023SJohn Marino __gthread_objc_condition_allocate (objc_condition_t condition UNUSED)
175*e4b17023SJohn Marino {
176*e4b17023SJohn Marino return 0;
177*e4b17023SJohn Marino }
178*e4b17023SJohn Marino
179*e4b17023SJohn Marino /* Deallocate a condition. */
180*e4b17023SJohn Marino static inline int
__gthread_objc_condition_deallocate(objc_condition_t condition UNUSED)181*e4b17023SJohn Marino __gthread_objc_condition_deallocate (objc_condition_t condition UNUSED)
182*e4b17023SJohn Marino {
183*e4b17023SJohn Marino return 0;
184*e4b17023SJohn Marino }
185*e4b17023SJohn Marino
186*e4b17023SJohn Marino /* Wait on the condition */
187*e4b17023SJohn Marino static inline int
__gthread_objc_condition_wait(objc_condition_t condition UNUSED,objc_mutex_t mutex UNUSED)188*e4b17023SJohn Marino __gthread_objc_condition_wait (objc_condition_t condition UNUSED,
189*e4b17023SJohn Marino objc_mutex_t mutex UNUSED)
190*e4b17023SJohn Marino {
191*e4b17023SJohn Marino return 0;
192*e4b17023SJohn Marino }
193*e4b17023SJohn Marino
194*e4b17023SJohn Marino /* Wake up all threads waiting on this condition. */
195*e4b17023SJohn Marino static inline int
__gthread_objc_condition_broadcast(objc_condition_t condition UNUSED)196*e4b17023SJohn Marino __gthread_objc_condition_broadcast (objc_condition_t condition UNUSED)
197*e4b17023SJohn Marino {
198*e4b17023SJohn Marino return 0;
199*e4b17023SJohn Marino }
200*e4b17023SJohn Marino
201*e4b17023SJohn Marino /* Wake up one thread waiting on this condition. */
202*e4b17023SJohn Marino static inline int
__gthread_objc_condition_signal(objc_condition_t condition UNUSED)203*e4b17023SJohn Marino __gthread_objc_condition_signal (objc_condition_t condition UNUSED)
204*e4b17023SJohn Marino {
205*e4b17023SJohn Marino return 0;
206*e4b17023SJohn Marino }
207*e4b17023SJohn Marino
208*e4b17023SJohn Marino #else /* _LIBOBJC */
209*e4b17023SJohn Marino
210*e4b17023SJohn Marino static inline int
__gthread_active_p(void)211*e4b17023SJohn Marino __gthread_active_p (void)
212*e4b17023SJohn Marino {
213*e4b17023SJohn Marino return 0;
214*e4b17023SJohn Marino }
215*e4b17023SJohn Marino
216*e4b17023SJohn Marino static inline int
__gthread_once(__gthread_once_t * __once UNUSED,void (* __func)(void)UNUSED)217*e4b17023SJohn Marino __gthread_once (__gthread_once_t *__once UNUSED, void (*__func) (void) UNUSED)
218*e4b17023SJohn Marino {
219*e4b17023SJohn Marino return 0;
220*e4b17023SJohn Marino }
221*e4b17023SJohn Marino
222*e4b17023SJohn Marino static inline int UNUSED
__gthread_key_create(__gthread_key_t * __key UNUSED,void (* __func)(void *)UNUSED)223*e4b17023SJohn Marino __gthread_key_create (__gthread_key_t *__key UNUSED, void (*__func) (void *) UNUSED)
224*e4b17023SJohn Marino {
225*e4b17023SJohn Marino return 0;
226*e4b17023SJohn Marino }
227*e4b17023SJohn Marino
228*e4b17023SJohn Marino static int UNUSED
__gthread_key_delete(__gthread_key_t __key UNUSED)229*e4b17023SJohn Marino __gthread_key_delete (__gthread_key_t __key UNUSED)
230*e4b17023SJohn Marino {
231*e4b17023SJohn Marino return 0;
232*e4b17023SJohn Marino }
233*e4b17023SJohn Marino
234*e4b17023SJohn Marino static inline void *
__gthread_getspecific(__gthread_key_t __key UNUSED)235*e4b17023SJohn Marino __gthread_getspecific (__gthread_key_t __key UNUSED)
236*e4b17023SJohn Marino {
237*e4b17023SJohn Marino return 0;
238*e4b17023SJohn Marino }
239*e4b17023SJohn Marino
240*e4b17023SJohn Marino static inline int
__gthread_setspecific(__gthread_key_t __key UNUSED,const void * __v UNUSED)241*e4b17023SJohn Marino __gthread_setspecific (__gthread_key_t __key UNUSED, const void *__v UNUSED)
242*e4b17023SJohn Marino {
243*e4b17023SJohn Marino return 0;
244*e4b17023SJohn Marino }
245*e4b17023SJohn Marino
246*e4b17023SJohn Marino static inline int
__gthread_mutex_destroy(__gthread_mutex_t * __mutex UNUSED)247*e4b17023SJohn Marino __gthread_mutex_destroy (__gthread_mutex_t *__mutex UNUSED)
248*e4b17023SJohn Marino {
249*e4b17023SJohn Marino return 0;
250*e4b17023SJohn Marino }
251*e4b17023SJohn Marino
252*e4b17023SJohn Marino static inline int
__gthread_mutex_lock(__gthread_mutex_t * __mutex UNUSED)253*e4b17023SJohn Marino __gthread_mutex_lock (__gthread_mutex_t *__mutex UNUSED)
254*e4b17023SJohn Marino {
255*e4b17023SJohn Marino return 0;
256*e4b17023SJohn Marino }
257*e4b17023SJohn Marino
258*e4b17023SJohn Marino static inline int
__gthread_mutex_trylock(__gthread_mutex_t * __mutex UNUSED)259*e4b17023SJohn Marino __gthread_mutex_trylock (__gthread_mutex_t *__mutex UNUSED)
260*e4b17023SJohn Marino {
261*e4b17023SJohn Marino return 0;
262*e4b17023SJohn Marino }
263*e4b17023SJohn Marino
264*e4b17023SJohn Marino static inline int
__gthread_mutex_unlock(__gthread_mutex_t * __mutex UNUSED)265*e4b17023SJohn Marino __gthread_mutex_unlock (__gthread_mutex_t *__mutex UNUSED)
266*e4b17023SJohn Marino {
267*e4b17023SJohn Marino return 0;
268*e4b17023SJohn Marino }
269*e4b17023SJohn Marino
270*e4b17023SJohn Marino static inline int
__gthread_recursive_mutex_lock(__gthread_recursive_mutex_t * __mutex)271*e4b17023SJohn Marino __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
272*e4b17023SJohn Marino {
273*e4b17023SJohn Marino return __gthread_mutex_lock (__mutex);
274*e4b17023SJohn Marino }
275*e4b17023SJohn Marino
276*e4b17023SJohn Marino static inline int
__gthread_recursive_mutex_trylock(__gthread_recursive_mutex_t * __mutex)277*e4b17023SJohn Marino __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
278*e4b17023SJohn Marino {
279*e4b17023SJohn Marino return __gthread_mutex_trylock (__mutex);
280*e4b17023SJohn Marino }
281*e4b17023SJohn Marino
282*e4b17023SJohn Marino static inline int
__gthread_recursive_mutex_unlock(__gthread_recursive_mutex_t * __mutex)283*e4b17023SJohn Marino __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
284*e4b17023SJohn Marino {
285*e4b17023SJohn Marino return __gthread_mutex_unlock (__mutex);
286*e4b17023SJohn Marino }
287*e4b17023SJohn Marino
288*e4b17023SJohn Marino #endif /* _LIBOBJC */
289*e4b17023SJohn Marino
290*e4b17023SJohn Marino #undef UNUSED
291*e4b17023SJohn Marino
292*e4b17023SJohn Marino #endif /* ! GCC_GTHR_SINGLE_H */
293