1951a39d68df598db08dfced8b4707755864a0492Ying Wang/* Threads compatibility routines for libgcc2 and libobjc. 2951a39d68df598db08dfced8b4707755864a0492Ying Wang Compile this one with gcc. 3951a39d68df598db08dfced8b4707755864a0492Ying Wang Copyright (C) 2004, 2005, 2008, 2009 Free Software Foundation, Inc. 4951a39d68df598db08dfced8b4707755864a0492Ying Wang 5951a39d68df598db08dfced8b4707755864a0492Ying WangThis file is part of GCC. 6951a39d68df598db08dfced8b4707755864a0492Ying Wang 7951a39d68df598db08dfced8b4707755864a0492Ying WangGCC is free software; you can redistribute it and/or modify it under 8951a39d68df598db08dfced8b4707755864a0492Ying Wangthe terms of the GNU General Public License as published by the Free 9951a39d68df598db08dfced8b4707755864a0492Ying WangSoftware Foundation; either version 3, or (at your option) any later 10951a39d68df598db08dfced8b4707755864a0492Ying Wangversion. 11951a39d68df598db08dfced8b4707755864a0492Ying Wang 12951a39d68df598db08dfced8b4707755864a0492Ying WangGCC is distributed in the hope that it will be useful, but WITHOUT ANY 13951a39d68df598db08dfced8b4707755864a0492Ying WangWARRANTY; without even the implied warranty of MERCHANTABILITY or 14951a39d68df598db08dfced8b4707755864a0492Ying WangFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15951a39d68df598db08dfced8b4707755864a0492Ying Wangfor more details. 16951a39d68df598db08dfced8b4707755864a0492Ying Wang 17951a39d68df598db08dfced8b4707755864a0492Ying WangUnder Section 7 of GPL version 3, you are granted additional 18951a39d68df598db08dfced8b4707755864a0492Ying Wangpermissions described in the GCC Runtime Library Exception, version 19951a39d68df598db08dfced8b4707755864a0492Ying Wang3.1, as published by the Free Software Foundation. 20951a39d68df598db08dfced8b4707755864a0492Ying Wang 21951a39d68df598db08dfced8b4707755864a0492Ying WangYou should have received a copy of the GNU General Public License and 22951a39d68df598db08dfced8b4707755864a0492Ying Wanga copy of the GCC Runtime Library Exception along with this program; 23951a39d68df598db08dfced8b4707755864a0492Ying Wangsee the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24951a39d68df598db08dfced8b4707755864a0492Ying Wang<http://www.gnu.org/licenses/>. */ 25951a39d68df598db08dfced8b4707755864a0492Ying Wang 26951a39d68df598db08dfced8b4707755864a0492Ying Wang/* TPF needs its own version of gthr-*.h because TPF always links to 27951a39d68df598db08dfced8b4707755864a0492Ying Wang the thread library. However, for performance reasons we still do not 28951a39d68df598db08dfced8b4707755864a0492Ying Wang want to issue thread api calls unless a check is made to see that we 29951a39d68df598db08dfced8b4707755864a0492Ying Wang are running as a thread. */ 30951a39d68df598db08dfced8b4707755864a0492Ying Wang 31951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef _GLIBCXX_GCC_GTHR_TPF_H 32951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _GLIBCXX_GCC_GTHR_TPF_H 33951a39d68df598db08dfced8b4707755864a0492Ying Wang 34951a39d68df598db08dfced8b4707755864a0492Ying Wang/* POSIX threads specific definitions. 35951a39d68df598db08dfced8b4707755864a0492Ying Wang Easy, since the interface is just one-to-one mapping. */ 36951a39d68df598db08dfced8b4707755864a0492Ying Wang 37951a39d68df598db08dfced8b4707755864a0492Ying Wang#define __GTHREADS 1 38951a39d68df598db08dfced8b4707755864a0492Ying Wang 39951a39d68df598db08dfced8b4707755864a0492Ying Wang/* Some implementations of <pthread.h> require this to be defined. */ 40951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef _REENTRANT 41951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _REENTRANT 1 42951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif 43951a39d68df598db08dfced8b4707755864a0492Ying Wang 44951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <pthread.h> 45951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <unistd.h> 46951a39d68df598db08dfced8b4707755864a0492Ying Wang 47951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef pthread_key_t __gthread_key_t; 48951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef pthread_once_t __gthread_once_t; 49951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef pthread_mutex_t __gthread_mutex_t; 50951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef pthread_mutex_t __gthread_recursive_mutex_t; 51951a39d68df598db08dfced8b4707755864a0492Ying Wang 52951a39d68df598db08dfced8b4707755864a0492Ying Wang#if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER) 53951a39d68df598db08dfced8b4707755864a0492Ying Wang#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER 54951a39d68df598db08dfced8b4707755864a0492Ying Wang#elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) 55951a39d68df598db08dfced8b4707755864a0492Ying Wang#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 56951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif 57951a39d68df598db08dfced8b4707755864a0492Ying Wang 58951a39d68df598db08dfced8b4707755864a0492Ying Wang#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER 59951a39d68df598db08dfced8b4707755864a0492Ying Wang#define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT 60951a39d68df598db08dfced8b4707755864a0492Ying Wang#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function 61951a39d68df598db08dfced8b4707755864a0492Ying Wang 62951a39d68df598db08dfced8b4707755864a0492Ying Wang#define NOTATHREAD 00 63951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ECBBASEPTR (unsigned long int) *(unsigned int *)0x00000514u 64951a39d68df598db08dfced8b4707755864a0492Ying Wang#define ECBPG2PTR ECBBASEPTR + 0x1000 65951a39d68df598db08dfced8b4707755864a0492Ying Wang#define CE2THRCPTR *((unsigned char *)(ECBPG2PTR + 16)) 66951a39d68df598db08dfced8b4707755864a0492Ying Wang#define __tpf_pthread_active() (CE2THRCPTR != NOTATHREAD) 67951a39d68df598db08dfced8b4707755864a0492Ying Wang 68951a39d68df598db08dfced8b4707755864a0492Ying Wang#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK 69951a39d68df598db08dfced8b4707755864a0492Ying Wang# define __gthrw(name) \ 70951a39d68df598db08dfced8b4707755864a0492Ying Wang static __typeof(name) __gthrw_ ## name __attribute__ ((__weakref__(#name))); 71951a39d68df598db08dfced8b4707755864a0492Ying Wang# define __gthrw_(name) __gthrw_ ## name 72951a39d68df598db08dfced8b4707755864a0492Ying Wang#else 73951a39d68df598db08dfced8b4707755864a0492Ying Wang# define __gthrw(name) 74951a39d68df598db08dfced8b4707755864a0492Ying Wang# define __gthrw_(name) name 75951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif 76951a39d68df598db08dfced8b4707755864a0492Ying Wang 77951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_once) 78951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_key_create) 79951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_key_delete) 80951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_getspecific) 81951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_setspecific) 82951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_create) 83951a39d68df598db08dfced8b4707755864a0492Ying Wang 84951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_mutex_lock) 85951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_mutex_trylock) 86951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_mutex_unlock) 87951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_mutexattr_init) 88951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_mutexattr_settype) 89951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_mutexattr_destroy) 90951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_mutex_init) 91951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthrw(pthread_mutex_destroy) 92951a39d68df598db08dfced8b4707755864a0492Ying Wang 93951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 94951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_active_p (void) 95951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 96951a39d68df598db08dfced8b4707755864a0492Ying Wang return 1; 97951a39d68df598db08dfced8b4707755864a0492Ying Wang} 98951a39d68df598db08dfced8b4707755864a0492Ying Wang 99951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 100951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_once (__gthread_once_t *__once, void (*__func) (void)) 101951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 102951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 103951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthrw_(pthread_once) (__once, __func); 104951a39d68df598db08dfced8b4707755864a0492Ying Wang else 105951a39d68df598db08dfced8b4707755864a0492Ying Wang return -1; 106951a39d68df598db08dfced8b4707755864a0492Ying Wang} 107951a39d68df598db08dfced8b4707755864a0492Ying Wang 108951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 109951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) 110951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 111951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 112951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthrw_(pthread_key_create) (__key, __dtor); 113951a39d68df598db08dfced8b4707755864a0492Ying Wang else 114951a39d68df598db08dfced8b4707755864a0492Ying Wang return -1; 115951a39d68df598db08dfced8b4707755864a0492Ying Wang} 116951a39d68df598db08dfced8b4707755864a0492Ying Wang 117951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 118951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_key_delete (__gthread_key_t __key) 119951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 120951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 121951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthrw_(pthread_key_delete) (__key); 122951a39d68df598db08dfced8b4707755864a0492Ying Wang else 123951a39d68df598db08dfced8b4707755864a0492Ying Wang return -1; 124951a39d68df598db08dfced8b4707755864a0492Ying Wang} 125951a39d68df598db08dfced8b4707755864a0492Ying Wang 126951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline void * 127951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_getspecific (__gthread_key_t __key) 128951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 129951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 130951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthrw_(pthread_getspecific) (__key); 131951a39d68df598db08dfced8b4707755864a0492Ying Wang else 132951a39d68df598db08dfced8b4707755864a0492Ying Wang return NULL; 133951a39d68df598db08dfced8b4707755864a0492Ying Wang} 134951a39d68df598db08dfced8b4707755864a0492Ying Wang 135951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 136951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_setspecific (__gthread_key_t __key, const void *__ptr) 137951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 138951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 139951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthrw_(pthread_setspecific) (__key, __ptr); 140951a39d68df598db08dfced8b4707755864a0492Ying Wang else 141951a39d68df598db08dfced8b4707755864a0492Ying Wang return -1; 142951a39d68df598db08dfced8b4707755864a0492Ying Wang} 143951a39d68df598db08dfced8b4707755864a0492Ying Wang 144951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 145951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_mutex_destroy (__gthread_mutex_t *__mutex) 146951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 147951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 148951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthrw_(pthread_mutex_destroy) (__mutex); 149951a39d68df598db08dfced8b4707755864a0492Ying Wang else 150951a39d68df598db08dfced8b4707755864a0492Ying Wang return 0; 151951a39d68df598db08dfced8b4707755864a0492Ying Wang} 152951a39d68df598db08dfced8b4707755864a0492Ying Wang 153951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 154951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_mutex_lock (__gthread_mutex_t *__mutex) 155951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 156951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 157951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthrw_(pthread_mutex_lock) (__mutex); 158951a39d68df598db08dfced8b4707755864a0492Ying Wang else 159951a39d68df598db08dfced8b4707755864a0492Ying Wang return 0; 160951a39d68df598db08dfced8b4707755864a0492Ying Wang} 161951a39d68df598db08dfced8b4707755864a0492Ying Wang 162951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 163951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_mutex_trylock (__gthread_mutex_t *__mutex) 164951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 165951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 166951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthrw_(pthread_mutex_trylock) (__mutex); 167951a39d68df598db08dfced8b4707755864a0492Ying Wang else 168951a39d68df598db08dfced8b4707755864a0492Ying Wang return 0; 169951a39d68df598db08dfced8b4707755864a0492Ying Wang} 170951a39d68df598db08dfced8b4707755864a0492Ying Wang 171951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 172951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_mutex_unlock (__gthread_mutex_t *__mutex) 173951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 174951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 175951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthrw_(pthread_mutex_unlock) (__mutex); 176951a39d68df598db08dfced8b4707755864a0492Ying Wang else 177951a39d68df598db08dfced8b4707755864a0492Ying Wang return 0; 178951a39d68df598db08dfced8b4707755864a0492Ying Wang} 179951a39d68df598db08dfced8b4707755864a0492Ying Wang 180951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 181951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) 182951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 183951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 184951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthread_mutex_lock (__mutex); 185951a39d68df598db08dfced8b4707755864a0492Ying Wang else 186951a39d68df598db08dfced8b4707755864a0492Ying Wang return 0; 187951a39d68df598db08dfced8b4707755864a0492Ying Wang} 188951a39d68df598db08dfced8b4707755864a0492Ying Wang 189951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 190951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) 191951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 192951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 193951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthread_mutex_trylock (__mutex); 194951a39d68df598db08dfced8b4707755864a0492Ying Wang else 195951a39d68df598db08dfced8b4707755864a0492Ying Wang return 0; 196951a39d68df598db08dfced8b4707755864a0492Ying Wang} 197951a39d68df598db08dfced8b4707755864a0492Ying Wang 198951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 199951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) 200951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 201951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 202951a39d68df598db08dfced8b4707755864a0492Ying Wang return __gthread_mutex_unlock (__mutex); 203951a39d68df598db08dfced8b4707755864a0492Ying Wang else 204951a39d68df598db08dfced8b4707755864a0492Ying Wang return 0; 205951a39d68df598db08dfced8b4707755864a0492Ying Wang} 206951a39d68df598db08dfced8b4707755864a0492Ying Wang 207951a39d68df598db08dfced8b4707755864a0492Ying Wangstatic inline int 208951a39d68df598db08dfced8b4707755864a0492Ying Wang__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) 209951a39d68df598db08dfced8b4707755864a0492Ying Wang{ 210951a39d68df598db08dfced8b4707755864a0492Ying Wang if (__tpf_pthread_active ()) 211951a39d68df598db08dfced8b4707755864a0492Ying Wang { 212951a39d68df598db08dfced8b4707755864a0492Ying Wang pthread_mutexattr_t __attr; 213951a39d68df598db08dfced8b4707755864a0492Ying Wang int __r; 214951a39d68df598db08dfced8b4707755864a0492Ying Wang 215951a39d68df598db08dfced8b4707755864a0492Ying Wang __r = __gthrw_(pthread_mutexattr_init) (&__attr); 216951a39d68df598db08dfced8b4707755864a0492Ying Wang if (!__r) 217951a39d68df598db08dfced8b4707755864a0492Ying Wang __r = __gthrw_(pthread_mutexattr_settype) (&__attr, 218951a39d68df598db08dfced8b4707755864a0492Ying Wang PTHREAD_MUTEX_RECURSIVE); 219951a39d68df598db08dfced8b4707755864a0492Ying Wang if (!__r) 220951a39d68df598db08dfced8b4707755864a0492Ying Wang __r = __gthrw_(pthread_mutex_init) (__mutex, &__attr); 221951a39d68df598db08dfced8b4707755864a0492Ying Wang if (!__r) 222951a39d68df598db08dfced8b4707755864a0492Ying Wang __r = __gthrw_(pthread_mutexattr_destroy) (&__attr); 223951a39d68df598db08dfced8b4707755864a0492Ying Wang return __r; 224951a39d68df598db08dfced8b4707755864a0492Ying Wang } 225951a39d68df598db08dfced8b4707755864a0492Ying Wang return 0; 226951a39d68df598db08dfced8b4707755864a0492Ying Wang} 227951a39d68df598db08dfced8b4707755864a0492Ying Wang 228951a39d68df598db08dfced8b4707755864a0492Ying Wang 229951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif /* ! _GLIBCXX_GCC_GTHR_TPF_H */ 230