111
|
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-2017 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
|
|
60 __gthread_active_p (void)
|
|
61 {
|
|
62 return 1;
|
|
63 }
|
|
64
|
|
65 static 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
|
|
72 static inline int
|
|
73 __gthread_join (__gthread_t __threadid, void **__value_ptr)
|
|
74 {
|
|
75 return pthread_join (__threadid, __value_ptr);
|
|
76 }
|
|
77
|
|
78 static inline int
|
|
79 __gthread_detach (__gthread_t __threadid)
|
|
80 {
|
|
81 return pthread_detach (__threadid);
|
|
82 }
|
|
83
|
|
84 static inline int
|
|
85 __gthread_equal (__gthread_t __t1, __gthread_t __t2)
|
|
86 {
|
|
87 return pthread_equal (__t1, __t2);
|
|
88 }
|
|
89
|
|
90 static inline __gthread_t
|
|
91 __gthread_self (void)
|
|
92 {
|
|
93 return pthread_self ();
|
|
94 }
|
|
95
|
|
96 static inline int
|
|
97 __gthread_yield (void)
|
|
98 {
|
|
99 return sched_yield ();
|
|
100 }
|
|
101
|
|
102 static inline int
|
|
103 __gthread_once (__gthread_once_t *__once, void (*__func) (void))
|
|
104 {
|
|
105 return pthread_once (__once, __func);
|
|
106 }
|
|
107
|
|
108 static inline int
|
|
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
|
|
115 __gthread_key_delete (__gthread_key_t __key)
|
|
116 {
|
|
117 return pthread_key_delete (__key);
|
|
118 }
|
|
119
|
|
120 static inline void *
|
|
121 __gthread_getspecific (__gthread_key_t __key)
|
|
122 {
|
|
123 return pthread_getspecific (__key);
|
|
124 }
|
|
125
|
|
126 static inline int
|
|
127 __gthread_setspecific (__gthread_key_t __key, const void *__ptr)
|
|
128 {
|
|
129 return pthread_setspecific (__key, __ptr);
|
|
130 }
|
|
131
|
|
132 static inline int
|
|
133 __gthread_mutex_lock (__gthread_mutex_t *__mutex)
|
|
134 {
|
|
135 _Mutex_Acquire (__mutex);
|
|
136 return 0;
|
|
137 }
|
|
138
|
|
139 static inline int
|
|
140 __gthread_mutex_trylock (__gthread_mutex_t *__mutex)
|
|
141 {
|
|
142 return _Mutex_Try_acquire (__mutex);
|
|
143 }
|
|
144
|
|
145 static 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
|
|
152 static inline int
|
|
153 __gthread_mutex_unlock (__gthread_mutex_t *__mutex)
|
|
154 {
|
|
155 _Mutex_Release (__mutex);
|
|
156 return 0;
|
|
157 }
|
|
158
|
|
159 static inline int
|
|
160 __gthread_mutex_destroy (__gthread_mutex_t *__mutex)
|
|
161 {
|
|
162 _Mutex_Destroy (__mutex);
|
|
163 return 0;
|
|
164 }
|
|
165
|
|
166 static inline int
|
|
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
|
|
174 __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
|
|
175 {
|
|
176 return _Mutex_recursive_Try_acquire (__mutex);
|
|
177 }
|
|
178
|
|
179 static 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
|
|
186 static inline int
|
|
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
|
|
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
|
|
201 __gthread_cond_broadcast (__gthread_cond_t *__cond)
|
|
202 {
|
|
203 _Condition_Broadcast (__cond);
|
|
204 return 0;
|
|
205 }
|
|
206
|
|
207 static inline int
|
|
208 __gthread_cond_signal (__gthread_cond_t *__cond)
|
|
209 {
|
|
210 _Condition_Signal (__cond);
|
|
211 return 0;
|
|
212 }
|
|
213
|
|
214 static 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
|
|
221 static 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
|
|
228 static 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
|
|
236 static 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 */
|