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