xref: /dflybsd-src/contrib/gcc-4.7/libgcc/gthr-single.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
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