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, 1999, 2000, 2002, 2003, 2005, 2008, 2009 5 Free Software Foundation, Inc. 6 7This file is part of GCC. 8 9GCC is free software; you can redistribute it and/or modify it under 10the terms of the GNU General Public License as published by the Free 11Software Foundation; either version 3, or (at your option) any later 12version. 13 14GCC is distributed in the hope that it will be useful, but WITHOUT ANY 15WARRANTY; without even the implied warranty of MERCHANTABILITY or 16FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 17for more details. 18 19Under Section 7 of GPL version 3, you are granted additional 20permissions described in the GCC Runtime Library Exception, version 213.1, as published by the Free Software Foundation. 22 23You should have received a copy of the GNU General Public License and 24a copy of the GCC Runtime Library Exception along with this program; 25see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 26<http://www.gnu.org/licenses/>. */ 27 28#ifndef GCC_GTHR_RTEMS_H 29#define GCC_GTHR_RTEMS_H 30 31#ifdef __cplusplus 32extern "C" { 33#endif 34 35#define __GTHREADS 1 36 37#define __GTHREAD_ONCE_INIT 0 38#define __GTHREAD_MUTEX_INIT_FUNCTION rtems_gxx_mutex_init 39#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION rtems_gxx_recursive_mutex_init 40 41/* Avoid dependency on rtems specific headers. */ 42typedef void *__gthread_key_t; 43typedef int __gthread_once_t; 44typedef void *__gthread_mutex_t; 45typedef void *__gthread_recursive_mutex_t; 46 47/* 48 * External functions provided by RTEMS. They are very similar to their POSIX 49 * counterparts. A "Wrapper API" is being use to avoid dependency on any RTEMS 50 * header files. 51 */ 52 53/* generic per task variables */ 54extern int rtems_gxx_once (__gthread_once_t *__once, void (*__func) (void)); 55extern int rtems_gxx_key_create (__gthread_key_t *__key, void (*__dtor) (void *)); 56extern int rtems_gxx_key_delete (__gthread_key_t __key); 57extern void *rtems_gxx_getspecific (__gthread_key_t __key); 58extern int rtems_gxx_setspecific (__gthread_key_t __key, const void *__ptr); 59 60/* mutex support */ 61extern void rtems_gxx_mutex_init (__gthread_mutex_t *__mutex); 62extern int rtems_gxx_mutex_destroy (__gthread_mutex_t *__mutex); 63extern int rtems_gxx_mutex_lock (__gthread_mutex_t *__mutex); 64extern int rtems_gxx_mutex_trylock (__gthread_mutex_t *__mutex); 65extern int rtems_gxx_mutex_unlock (__gthread_mutex_t *__mutex); 66 67/* recursive mutex support */ 68extern void rtems_gxx_recursive_mutex_init (__gthread_recursive_mutex_t *__mutex); 69extern int rtems_gxx_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex); 70extern int rtems_gxx_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex); 71extern int rtems_gxx_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex); 72 73/* RTEMS threading is always active */ 74static inline int 75__gthread_active_p (void) 76{ 77 return 1; 78} 79 80/* Wrapper calls */ 81static inline int 82__gthread_once (__gthread_once_t *__once, void (*__func) (void)) 83{ 84 return rtems_gxx_once( __once, __func ); 85} 86 87static inline int 88__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) 89{ 90 return rtems_gxx_key_create( __key, __dtor ); 91} 92 93static inline int 94__gthread_key_delete (__gthread_key_t __key) 95{ 96 return rtems_gxx_key_delete (__key); 97} 98 99static inline void * 100__gthread_getspecific (__gthread_key_t __key) 101{ 102 return rtems_gxx_getspecific (__key); 103} 104 105static inline int 106__gthread_setspecific (__gthread_key_t __key, const void *__ptr) 107{ 108 return rtems_gxx_setspecific (__key, __ptr); 109} 110 111static inline int 112__gthread_mutex_destroy (__gthread_mutex_t *__mutex) 113{ 114 return rtems_gxx_mutex_destroy (__mutex); 115} 116 117static inline int 118__gthread_mutex_lock (__gthread_mutex_t *__mutex) 119{ 120 return rtems_gxx_mutex_lock (__mutex); 121} 122 123static inline int 124__gthread_mutex_trylock (__gthread_mutex_t *__mutex) 125{ 126 return rtems_gxx_mutex_trylock (__mutex); 127} 128 129static inline int 130__gthread_mutex_unlock (__gthread_mutex_t *__mutex) 131{ 132 return rtems_gxx_mutex_unlock( __mutex ); 133} 134 135static inline int 136__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) 137{ 138 return rtems_gxx_recursive_mutex_lock (__mutex); 139} 140 141static inline int 142__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) 143{ 144 return rtems_gxx_recursive_mutex_trylock (__mutex); 145} 146 147static inline int 148__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) 149{ 150 return rtems_gxx_recursive_mutex_unlock( __mutex ); 151} 152 153#ifdef __cplusplus 154} 155#endif 156 157#endif /* ! GCC_GTHR_RTEMS_H */ 158