1/* This file is automatically generated. DO NOT EDIT! */ 2/* Generated from: NetBSD: mknative-gcc,v 1.58 2011/07/02 13:25:05 mrg Exp */ 3/* Generated from: NetBSD: mknative.common,v 1.9 2007/02/05 18:26:01 apb Exp */ 4 5/* Threads compatibility routines for libgcc2 and libobjc. 6 Compile this one with gcc. 7 Copyright (C) 2004, 2005, 2008, 2009 Free Software Foundation, Inc. 8 9This file is part of GCC. 10 11GCC is free software; you can redistribute it and/or modify it under 12the terms of the GNU General Public License as published by the Free 13Software Foundation; either version 3, or (at your option) any later 14version. 15 16GCC is distributed in the hope that it will be useful, but WITHOUT ANY 17WARRANTY; without even the implied warranty of MERCHANTABILITY or 18FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 19for more details. 20 21Under Section 7 of GPL version 3, you are granted additional 22permissions described in the GCC Runtime Library Exception, version 233.1, as published by the Free Software Foundation. 24 25You should have received a copy of the GNU General Public License and 26a copy of the GCC Runtime Library Exception along with this program; 27see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 28<http://www.gnu.org/licenses/>. */ 29 30/* TPF needs its own version of gthr-*.h because TPF always links to 31 the thread library. However, for performance reasons we still do not 32 want to issue thread api calls unless a check is made to see that we 33 are running as a thread. */ 34 35#ifndef _GLIBCXX_GCC_GTHR_TPF_H 36#define _GLIBCXX_GCC_GTHR_TPF_H 37 38/* POSIX threads specific definitions. 39 Easy, since the interface is just one-to-one mapping. */ 40 41#define __GTHREADS 1 42 43/* Some implementations of <pthread.h> require this to be defined. */ 44#ifndef _REENTRANT 45#define _REENTRANT 1 46#endif 47 48#include <pthread.h> 49#include <unistd.h> 50 51typedef pthread_key_t __gthread_key_t; 52typedef pthread_once_t __gthread_once_t; 53typedef pthread_mutex_t __gthread_mutex_t; 54typedef pthread_mutex_t __gthread_recursive_mutex_t; 55 56#if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER) 57#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER 58#elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) 59#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 60#endif 61 62#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER 63#define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT 64#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function 65 66#define NOTATHREAD 00 67#define ECBBASEPTR (unsigned long int) *(unsigned int *)0x00000514u 68#define ECBPG2PTR ECBBASEPTR + 0x1000 69#define CE2THRCPTR *((unsigned char *)(ECBPG2PTR + 16)) 70#define __tpf_pthread_active() (CE2THRCPTR != NOTATHREAD) 71 72#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK 73# define __gthrw(name) \ 74 static __typeof(name) __gthrw_ ## name __attribute__ ((__weakref__(#name))); 75# define __gthrw_(name) __gthrw_ ## name 76#else 77# define __gthrw(name) 78# define __gthrw_(name) name 79#endif 80 81__gthrw(pthread_once) 82__gthrw(pthread_key_create) 83__gthrw(pthread_key_delete) 84__gthrw(pthread_getspecific) 85__gthrw(pthread_setspecific) 86__gthrw(pthread_create) 87 88__gthrw(pthread_mutex_lock) 89__gthrw(pthread_mutex_trylock) 90__gthrw(pthread_mutex_unlock) 91__gthrw(pthread_mutexattr_init) 92__gthrw(pthread_mutexattr_settype) 93__gthrw(pthread_mutexattr_destroy) 94__gthrw(pthread_mutex_init) 95__gthrw(pthread_mutex_destroy) 96 97static inline int 98__gthread_active_p (void) 99{ 100 return 1; 101} 102 103static inline int 104__gthread_once (__gthread_once_t *__once, void (*__func) (void)) 105{ 106 if (__tpf_pthread_active ()) 107 return __gthrw_(pthread_once) (__once, __func); 108 else 109 return -1; 110} 111 112static inline int 113__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *)) 114{ 115 if (__tpf_pthread_active ()) 116 return __gthrw_(pthread_key_create) (__key, __dtor); 117 else 118 return -1; 119} 120 121static inline int 122__gthread_key_delete (__gthread_key_t __key) 123{ 124 if (__tpf_pthread_active ()) 125 return __gthrw_(pthread_key_delete) (__key); 126 else 127 return -1; 128} 129 130static inline void * 131__gthread_getspecific (__gthread_key_t __key) 132{ 133 if (__tpf_pthread_active ()) 134 return __gthrw_(pthread_getspecific) (__key); 135 else 136 return NULL; 137} 138 139static inline int 140__gthread_setspecific (__gthread_key_t __key, const void *__ptr) 141{ 142 if (__tpf_pthread_active ()) 143 return __gthrw_(pthread_setspecific) (__key, __ptr); 144 else 145 return -1; 146} 147 148static inline int 149__gthread_mutex_destroy (__gthread_mutex_t *__mutex) 150{ 151 if (__tpf_pthread_active ()) 152 return __gthrw_(pthread_mutex_destroy) (__mutex); 153 else 154 return 0; 155} 156 157static inline int 158__gthread_mutex_lock (__gthread_mutex_t *__mutex) 159{ 160 if (__tpf_pthread_active ()) 161 return __gthrw_(pthread_mutex_lock) (__mutex); 162 else 163 return 0; 164} 165 166static inline int 167__gthread_mutex_trylock (__gthread_mutex_t *__mutex) 168{ 169 if (__tpf_pthread_active ()) 170 return __gthrw_(pthread_mutex_trylock) (__mutex); 171 else 172 return 0; 173} 174 175static inline int 176__gthread_mutex_unlock (__gthread_mutex_t *__mutex) 177{ 178 if (__tpf_pthread_active ()) 179 return __gthrw_(pthread_mutex_unlock) (__mutex); 180 else 181 return 0; 182} 183 184static inline int 185__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) 186{ 187 if (__tpf_pthread_active ()) 188 return __gthread_mutex_lock (__mutex); 189 else 190 return 0; 191} 192 193static inline int 194__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) 195{ 196 if (__tpf_pthread_active ()) 197 return __gthread_mutex_trylock (__mutex); 198 else 199 return 0; 200} 201 202static inline int 203__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) 204{ 205 if (__tpf_pthread_active ()) 206 return __gthread_mutex_unlock (__mutex); 207 else 208 return 0; 209} 210 211static inline int 212__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) 213{ 214 if (__tpf_pthread_active ()) 215 { 216 pthread_mutexattr_t __attr; 217 int __r; 218 219 __r = __gthrw_(pthread_mutexattr_init) (&__attr); 220 if (!__r) 221 __r = __gthrw_(pthread_mutexattr_settype) (&__attr, 222 PTHREAD_MUTEX_RECURSIVE); 223 if (!__r) 224 __r = __gthrw_(pthread_mutex_init) (__mutex, &__attr); 225 if (!__r) 226 __r = __gthrw_(pthread_mutexattr_destroy) (&__attr); 227 return __r; 228 } 229 return 0; 230} 231 232 233#endif /* ! _GLIBCXX_GCC_GTHR_TPF_H */ 234