1 /* RTEMS threads compatibility routines for libgcc2 and libobjc.
2    by: Rosimildo da Silva( rdasilva@connecttel.com ) */
3 /* Compile this one with gcc.  */
4 /* Copyright (C) 1997-2016 Free Software Foundation, Inc.
5 
6 This file is part of GCC.
7 
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12 
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17 
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
21 
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25 <http://www.gnu.org/licenses/>.  */
26 
27 #ifndef GCC_GTHR_RTEMS_H
28 #define GCC_GTHR_RTEMS_H
29 
30 #include <sys/lock.h>
31 #include <pthread.h>
32 #include <sched.h>
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #define __GTHREADS 1
39 #define __GTHREADS_CXX0X 1
40 #define __GTHREAD_HAS_COND 1
41 
42 typedef pthread_t __gthread_t;
43 typedef pthread_key_t __gthread_key_t;
44 typedef pthread_once_t __gthread_once_t;
45 typedef struct _Mutex_Control __gthread_mutex_t;
46 typedef struct _Mutex_recursive_Control __gthread_recursive_mutex_t;
47 typedef struct _Condition_Control __gthread_cond_t;
48 typedef struct timespec __gthread_time_t;
49 
50 #define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT
51 #define __GTHREAD_MUTEX_INIT _MUTEX_INITIALIZER
52 #define __GTHREAD_MUTEX_INIT_FUNCTION _Mutex_Initialize
53 #define __GTHREAD_RECURSIVE_MUTEX_INIT _MUTEX_RECURSIVE_INITIALIZER
54 #define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION _Mutex_recursive_Initialize
55 #define __GTHREAD_COND_INIT _CONDITION_INITIALIZER
56 #define __GTHREAD_COND_INIT_FUNCTION _Condition_Initialize
57 #define __GTHREAD_TIME_INIT {0, 0}
58 
59 static inline int
__gthread_active_p(void)60 __gthread_active_p (void)
61 {
62   return 1;
63 }
64 
65 static inline int
__gthread_create(__gthread_t * __threadid,void * (* __func)(void *),void * __args)66 __gthread_create (__gthread_t *__threadid, void *(*__func) (void *),
67 		  void *__args)
68 {
69   return pthread_create (__threadid, NULL, __func, __args);
70 }
71 
72 static inline int
__gthread_join(__gthread_t __threadid,void ** __value_ptr)73 __gthread_join (__gthread_t __threadid, void **__value_ptr)
74 {
75   return pthread_join (__threadid, __value_ptr);
76 }
77 
78 static inline int
__gthread_detach(__gthread_t __threadid)79 __gthread_detach (__gthread_t __threadid)
80 {
81   return pthread_detach (__threadid);
82 }
83 
84 static inline int
__gthread_equal(__gthread_t __t1,__gthread_t __t2)85 __gthread_equal (__gthread_t __t1, __gthread_t __t2)
86 {
87   return pthread_equal (__t1, __t2);
88 }
89 
90 static inline __gthread_t
__gthread_self(void)91 __gthread_self (void)
92 {
93   return pthread_self ();
94 }
95 
96 static inline int
__gthread_yield(void)97 __gthread_yield (void)
98 {
99   return sched_yield ();
100 }
101 
102 static inline int
__gthread_once(__gthread_once_t * __once,void (* __func)(void))103 __gthread_once (__gthread_once_t *__once, void (*__func) (void))
104 {
105    return pthread_once (__once, __func);
106 }
107 
108 static inline int
__gthread_key_create(__gthread_key_t * __key,void (* __dtor)(void *))109 __gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
110 {
111   return pthread_key_create (__key, __dtor);
112 }
113 
114 static inline int
__gthread_key_delete(__gthread_key_t __key)115 __gthread_key_delete (__gthread_key_t __key)
116 {
117   return pthread_key_delete (__key);
118 }
119 
120 static inline void *
__gthread_getspecific(__gthread_key_t __key)121 __gthread_getspecific (__gthread_key_t __key)
122 {
123   return pthread_getspecific (__key);
124 }
125 
126 static inline int
__gthread_setspecific(__gthread_key_t __key,const void * __ptr)127 __gthread_setspecific (__gthread_key_t __key, const void *__ptr)
128 {
129   return pthread_setspecific (__key, __ptr);
130 }
131 
132 static inline int
__gthread_mutex_lock(__gthread_mutex_t * __mutex)133 __gthread_mutex_lock (__gthread_mutex_t *__mutex)
134 {
135   _Mutex_Acquire (__mutex);
136   return 0;
137 }
138 
139 static inline int
__gthread_mutex_trylock(__gthread_mutex_t * __mutex)140 __gthread_mutex_trylock (__gthread_mutex_t *__mutex)
141 {
142   return _Mutex_Try_acquire (__mutex);
143 }
144 
145 static inline int
__gthread_mutex_timedlock(__gthread_mutex_t * __mutex,const __gthread_time_t * __abs_timeout)146 __gthread_mutex_timedlock (__gthread_mutex_t *__mutex,
147 			   const __gthread_time_t *__abs_timeout)
148 {
149   return _Mutex_Acquire_timed (__mutex, __abs_timeout);
150 }
151 
152 static inline int
__gthread_mutex_unlock(__gthread_mutex_t * __mutex)153 __gthread_mutex_unlock (__gthread_mutex_t *__mutex)
154 {
155   _Mutex_Release (__mutex);
156   return 0;
157 }
158 
159 static inline int
__gthread_mutex_destroy(__gthread_mutex_t * __mutex)160 __gthread_mutex_destroy (__gthread_mutex_t *__mutex)
161 {
162   _Mutex_Destroy (__mutex);
163   return 0;
164 }
165 
166 static inline int
__gthread_recursive_mutex_lock(__gthread_recursive_mutex_t * __mutex)167 __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
168 {
169   _Mutex_recursive_Acquire (__mutex);
170   return 0;
171 }
172 
173 static inline int
__gthread_recursive_mutex_trylock(__gthread_recursive_mutex_t * __mutex)174 __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
175 {
176   return _Mutex_recursive_Try_acquire (__mutex);
177 }
178 
179 static inline int
__gthread_recursive_mutex_timedlock(__gthread_recursive_mutex_t * __mutex,const __gthread_time_t * __abs_timeout)180 __gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex,
181 				     const __gthread_time_t *__abs_timeout)
182 {
183   return _Mutex_recursive_Acquire_timed (__mutex, __abs_timeout);
184 }
185 
186 static inline int
__gthread_recursive_mutex_unlock(__gthread_recursive_mutex_t * __mutex)187 __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
188 {
189   _Mutex_recursive_Release (__mutex);
190   return 0;
191 }
192 
193 static inline int
__gthread_recursive_mutex_destroy(__gthread_recursive_mutex_t * __mutex)194 __gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex)
195 {
196   _Mutex_recursive_Destroy (__mutex);
197   return 0;
198 }
199 
200 static inline int
__gthread_cond_broadcast(__gthread_cond_t * __cond)201 __gthread_cond_broadcast (__gthread_cond_t *__cond)
202 {
203   _Condition_Broadcast (__cond);
204   return 0;
205 }
206 
207 static inline int
__gthread_cond_signal(__gthread_cond_t * __cond)208 __gthread_cond_signal (__gthread_cond_t *__cond)
209 {
210   _Condition_Signal (__cond);
211   return 0;
212 }
213 
214 static inline int
__gthread_cond_wait(__gthread_cond_t * __cond,__gthread_mutex_t * __mutex)215 __gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex)
216 {
217   _Condition_Wait (__cond, __mutex);
218   return 0;
219 }
220 
221 static inline int
__gthread_cond_timedwait(__gthread_cond_t * __cond,__gthread_mutex_t * __mutex,const __gthread_time_t * __abs_timeout)222 __gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex,
223 			  const __gthread_time_t *__abs_timeout)
224 {
225   return _Condition_Wait_timed (__cond, __mutex, __abs_timeout);
226 }
227 
228 static inline int
__gthread_cond_wait_recursive(__gthread_cond_t * __cond,__gthread_recursive_mutex_t * __mutex)229 __gthread_cond_wait_recursive (__gthread_cond_t *__cond,
230 			       __gthread_recursive_mutex_t *__mutex)
231 {
232   _Condition_Wait_recursive (__cond, __mutex);
233   return 0;
234 }
235 
236 static inline int
__gthread_cond_destroy(__gthread_cond_t * __cond)237 __gthread_cond_destroy (__gthread_cond_t *__cond)
238 {
239   _Condition_Destroy (__cond);
240   return 0;
241 }
242 
243 #ifdef __cplusplus
244 }
245 #endif
246 
247 #endif /* ! GCC_GTHR_RTEMS_H */
248