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-2020 Free Software Foundation, Inc.
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16for more details.
17
18Under Section 7 of GPL version 3, you are granted additional
19permissions described in the GCC Runtime Library Exception, version
203.1, as published by the Free Software Foundation.
21
22You should have received a copy of the GNU General Public License and
23a copy of the GCC Runtime Library Exception along with this program;
24see 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
35extern "C" {
36#endif
37
38#define __GTHREADS 1
39#define __GTHREADS_CXX0X 1
40#define __GTHREAD_HAS_COND 1
41
42typedef pthread_t __gthread_t;
43typedef pthread_key_t __gthread_key_t;
44typedef pthread_once_t __gthread_once_t;
45typedef struct _Mutex_Control __gthread_mutex_t;
46typedef struct _Mutex_recursive_Control __gthread_recursive_mutex_t;
47typedef struct _Condition_Control __gthread_cond_t;
48typedef 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
59static inline int
60__gthread_active_p (void)
61{
62  return 1;
63}
64
65static inline int
66__gthread_create (__gthread_t *__threadid, void *(*__func) (void *),
67		  void *__args)
68{
69  return pthread_create (__threadid, NULL, __func, __args);
70}
71
72static inline int
73__gthread_join (__gthread_t __threadid, void **__value_ptr)
74{
75  return pthread_join (__threadid, __value_ptr);
76}
77
78static inline int
79__gthread_detach (__gthread_t __threadid)
80{
81  return pthread_detach (__threadid);
82}
83
84static inline int
85__gthread_equal (__gthread_t __t1, __gthread_t __t2)
86{
87  return pthread_equal (__t1, __t2);
88}
89
90static inline __gthread_t
91__gthread_self (void)
92{
93  return pthread_self ();
94}
95
96static inline int
97__gthread_yield (void)
98{
99  return sched_yield ();
100}
101
102static inline int
103__gthread_once (__gthread_once_t *__once, void (*__func) (void))
104{
105   return pthread_once (__once, __func);
106}
107
108static inline int
109__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
110{
111  return pthread_key_create (__key, __dtor);
112}
113
114static inline int
115__gthread_key_delete (__gthread_key_t __key)
116{
117  return pthread_key_delete (__key);
118}
119
120static inline void *
121__gthread_getspecific (__gthread_key_t __key)
122{
123  return pthread_getspecific (__key);
124}
125
126static inline int
127__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
128{
129  return pthread_setspecific (__key, __ptr);
130}
131
132static inline int
133__gthread_mutex_lock (__gthread_mutex_t *__mutex)
134{
135  _Mutex_Acquire (__mutex);
136  return 0;
137}
138
139static inline int
140__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
141{
142  return _Mutex_Try_acquire (__mutex);
143}
144
145static inline int
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
152static inline int
153__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
154{
155  _Mutex_Release (__mutex);
156  return 0;
157}
158
159static inline int
160__gthread_mutex_destroy (__gthread_mutex_t *__mutex)
161{
162  _Mutex_Destroy (__mutex);
163  return 0;
164}
165
166static inline int
167__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
168{
169  _Mutex_recursive_Acquire (__mutex);
170  return 0;
171}
172
173static inline int
174__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
175{
176  return _Mutex_recursive_Try_acquire (__mutex);
177}
178
179static inline int
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
186static inline int
187__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
188{
189  _Mutex_recursive_Release (__mutex);
190  return 0;
191}
192
193static inline int
194__gthread_recursive_mutex_destroy (__gthread_recursive_mutex_t *__mutex)
195{
196  _Mutex_recursive_Destroy (__mutex);
197  return 0;
198}
199
200static inline int
201__gthread_cond_broadcast (__gthread_cond_t *__cond)
202{
203  _Condition_Broadcast (__cond);
204  return 0;
205}
206
207static inline int
208__gthread_cond_signal (__gthread_cond_t *__cond)
209{
210  _Condition_Signal (__cond);
211  return 0;
212}
213
214static inline int
215__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex)
216{
217  _Condition_Wait (__cond, __mutex);
218  return 0;
219}
220
221static inline int
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
228static inline int
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
236static inline int
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