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
2643f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh/* 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)
20943f272afd56a57640c62c952f9266478bacf0244Andrew Hsieh{
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