1132718Skan/* RTEMS threads compatibility routines for libgcc2 and libobjc. 290075Sobrien by: Rosimildo da Silva( rdasilva@connecttel.com ) */ 390075Sobrien/* Compile this one with gcc. */ 4169689Skan/* Copyright (C) 1997, 1999, 2000, 2002, 2003, 2005 5169689Skan Free Software Foundation, Inc. 690075Sobrien 790075SobrienThis file is part of GCC. 890075Sobrien 990075SobrienGCC is free software; you can redistribute it and/or modify it under 1090075Sobrienthe terms of the GNU General Public License as published by the Free 1190075SobrienSoftware Foundation; either version 2, or (at your option) any later 1290075Sobrienversion. 1390075Sobrien 1490075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY 1590075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or 1690075SobrienFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1790075Sobrienfor more details. 1890075Sobrien 1990075SobrienYou should have received a copy of the GNU General Public License 2090075Sobrienalong with GCC; see the file COPYING. If not, write to the Free 21169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 22169689Skan02110-1301, USA. */ 2390075Sobrien 2490075Sobrien/* As a special exception, if you link this library with other files, 2590075Sobrien some of which are compiled with GCC, to produce an executable, 2690075Sobrien this library does not by itself cause the resulting executable 2790075Sobrien to be covered by the GNU General Public License. 2890075Sobrien This exception does not however invalidate any other reasons why 2990075Sobrien the executable file might be covered by the GNU General Public License. */ 3090075Sobrien 3190075Sobrien#ifndef GCC_GTHR_RTEMS_H 3290075Sobrien#define GCC_GTHR_RTEMS_H 3390075Sobrien 3496263Sobrien#ifdef __cplusplus 3596263Sobrienextern "C" { 3696263Sobrien#endif 3790075Sobrien 3890075Sobrien#define __GTHREADS 1 3990075Sobrien 4090075Sobrien#define __GTHREAD_ONCE_INIT 0 41110611Skan#define __GTHREAD_MUTEX_INIT 0 4290075Sobrien#define __GTHREAD_MUTEX_INIT_FUNCTION rtems_gxx_mutex_init 43169689Skan#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION rtems_gxx_recursive_mutex_init 4490075Sobrien 45132718Skan/* Avoid dependency on rtems specific headers. */ 4690075Sobrientypedef void *__gthread_key_t; 4790075Sobrientypedef int __gthread_once_t; 4890075Sobrientypedef void *__gthread_mutex_t; 49169689Skantypedef void *__gthread_recursive_mutex_t; 5090075Sobrien 5190075Sobrien/* 52117395Skan * External functions provided by RTEMS. They are very similar to their POSIX 5390075Sobrien * counterparts. A "Wrapper API" is being use to avoid dependency on any RTEMS 5490075Sobrien * header files. 5590075Sobrien */ 5690075Sobrien 5790075Sobrien/* generic per task variables */ 5896263Sobrienextern int rtems_gxx_once (__gthread_once_t *once, void (*func) (void)); 5990075Sobrienextern int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *)); 6090075Sobrienextern int rtems_gxx_key_delete (__gthread_key_t key); 6190075Sobrienextern void *rtems_gxx_getspecific (__gthread_key_t key); 6290075Sobrienextern int rtems_gxx_setspecific (__gthread_key_t key, const void *ptr); 6390075Sobrien 6490075Sobrien/* mutex support */ 6590075Sobrienextern void rtems_gxx_mutex_init (__gthread_mutex_t *mutex); 6690075Sobrienextern int rtems_gxx_mutex_lock (__gthread_mutex_t *mutex); 6790075Sobrienextern int rtems_gxx_mutex_trylock (__gthread_mutex_t *mutex); 6890075Sobrienextern int rtems_gxx_mutex_unlock (__gthread_mutex_t *mutex); 6990075Sobrien 70169689Skan/* recursive mutex support */ 71169689Skanextern void rtems_gxx_recursive_mutex_init (__gthread_recursive_mutex_t *mutex); 72169689Skanextern int rtems_gxx_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex); 73169689Skanextern int rtems_gxx_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex); 74169689Skanextern int rtems_gxx_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex); 7590075Sobrien 7690075Sobrien/* RTEMS threading is always active */ 7790075Sobrienstatic inline int 7890075Sobrien__gthread_active_p (void) 7990075Sobrien{ 8090075Sobrien return 1; 8190075Sobrien} 8290075Sobrien 8390075Sobrien/* Wrapper calls */ 8490075Sobrienstatic inline int 8596263Sobrien__gthread_once (__gthread_once_t *once, void (*func) (void)) 8690075Sobrien{ 8790075Sobrien return rtems_gxx_once( once, func ); 8890075Sobrien} 8990075Sobrien 9090075Sobrienstatic inline int 9190075Sobrien__gthread_key_create (__gthread_key_t *key, void (*dtor) (void *)) 9290075Sobrien{ 9390075Sobrien return rtems_gxx_key_create( key, dtor ); 9490075Sobrien} 9590075Sobrien 9690075Sobrienstatic inline int 9790075Sobrien__gthread_key_delete (__gthread_key_t key) 9890075Sobrien{ 9990075Sobrien return rtems_gxx_key_delete (key); 10090075Sobrien} 10190075Sobrien 10290075Sobrienstatic inline void * 10390075Sobrien__gthread_getspecific (__gthread_key_t key) 10490075Sobrien{ 10590075Sobrien return rtems_gxx_getspecific (key); 10690075Sobrien} 10790075Sobrien 10890075Sobrienstatic inline int 10990075Sobrien__gthread_setspecific (__gthread_key_t key, const void *ptr) 11090075Sobrien{ 11190075Sobrien return rtems_gxx_setspecific (key, ptr); 11290075Sobrien} 11390075Sobrien 11490075Sobrienstatic inline int 11590075Sobrien__gthread_mutex_lock (__gthread_mutex_t *mutex) 11690075Sobrien{ 11790075Sobrien return rtems_gxx_mutex_lock (mutex); 11890075Sobrien} 11990075Sobrien 12090075Sobrienstatic inline int 12190075Sobrien__gthread_mutex_trylock (__gthread_mutex_t *mutex) 12290075Sobrien{ 12390075Sobrien return rtems_gxx_mutex_trylock (mutex); 12490075Sobrien} 12590075Sobrien 12690075Sobrienstatic inline int 12790075Sobrien__gthread_mutex_unlock (__gthread_mutex_t *mutex) 12890075Sobrien{ 12990075Sobrien return rtems_gxx_mutex_unlock( mutex ); 13090075Sobrien} 13190075Sobrien 132169689Skanstatic inline int 133169689Skan__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex) 134169689Skan{ 135169689Skan return rtems_gxx_recursive_mutex_lock (mutex); 136169689Skan} 137169689Skan 138169689Skanstatic inline int 139169689Skan__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex) 140169689Skan{ 141169689Skan return rtems_gxx_recursive_mutex_trylock (mutex); 142169689Skan} 143169689Skan 144169689Skanstatic inline int 145169689Skan__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex) 146169689Skan{ 147169689Skan return rtems_gxx_recursive_mutex_unlock( mutex ); 148169689Skan} 149169689Skan 15096263Sobrien#ifdef __cplusplus 15196263Sobrien} 15296263Sobrien#endif 15396263Sobrien 15490075Sobrien#endif /* ! GCC_GTHR_RTEMS_H */ 155