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