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