1cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Threads compatibility routines for libgcc2 and libobjc.  */
2cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Compile this one with gcc.  */
340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   2008, 2009, 2010 Free Software Foundation, Inc.
5cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
6cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew HsiehThis file is part of GCC.
7cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
8cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew HsiehGCC is free software; you can redistribute it and/or modify it under
9cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehthe terms of the GNU General Public License as published by the Free
10cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew HsiehSoftware Foundation; either version 3, or (at your option) any later
11cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehversion.
12cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
13cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew HsiehGCC is distributed in the hope that it will be useful, but WITHOUT ANY
14cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew HsiehWARRANTY; without even the implied warranty of MERCHANTABILITY or
15cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew HsiehFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehfor more details.
17cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
18cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew HsiehUnder Section 7 of GPL version 3, you are granted additional
19cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehpermissions described in the GCC Runtime Library Exception, version
20cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh3.1, as published by the Free Software Foundation.
21cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
22cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew HsiehYou should have received a copy of the GNU General Public License and
23cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieha copy of the GCC Runtime Library Exception along with this program;
24cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehsee the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh<http://www.gnu.org/licenses/>.  */
26cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
2740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifndef _GLIBCXX_GCC_GTHR_POSIX_H
2840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define _GLIBCXX_GCC_GTHR_POSIX_H
2940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
3040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* POSIX threads specific definitions.
3140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   Easy, since the interface is just one-to-one mapping.  */
3240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
3340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREADS 1
3440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREADS_CXX0X 1
3540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
3640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* Some implementations of <pthread.h> require this to be defined.  */
3740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if !defined(_REENTRANT) && defined(__osf__)
3840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define _REENTRANT 1
3940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
4040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
4140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* The following should normally be in a different header file,
4240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh * but I couldn't find the right location. The point of the macro
4340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh * definition below is to prevent libsupc++ and libstdc++ to reference
4440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh * weak symbols in their static C++ constructors. Such code crashes
4540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh * when a shared object linked statically to these libraries is
4640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh * loaded on Android 2.1 (Eclair) and older platform releases, due
4740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh * to a dynamic linker bug.
4840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh */
4940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef __ANDROID__
5040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#undef _GLIBCXX_GTHREAD_USE_WEAK
5140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define _GLIBCXX_GTHREAD_USE_WEAK 0
5240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
5340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
5440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#include <pthread.h>
5540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#include <unistd.h>
5640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
5740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehtypedef pthread_t __gthread_t;
5840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehtypedef pthread_key_t __gthread_key_t;
5940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehtypedef pthread_once_t __gthread_once_t;
6040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehtypedef pthread_mutex_t __gthread_mutex_t;
6140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehtypedef pthread_mutex_t __gthread_recursive_mutex_t;
6240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehtypedef pthread_cond_t __gthread_cond_t;
6340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehtypedef struct timespec __gthread_time_t;
6440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
6540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* POSIX like conditional variables are supported.  Please look at comments
6640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   in gthr.h for details. */
6740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREAD_HAS_COND	1
6840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
6940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
7040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT
7140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER)
7240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER
7340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP)
7440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREAD_RECURSIVE_MUTEX_INIT PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
7540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#else
7640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function
7740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
7840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER
7940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __GTHREAD_TIME_INIT {0,0}
8040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
8140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK
8240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh# ifndef __gthrw_pragma
8340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#  define __gthrw_pragma(pragma)
8440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh# endif
8540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh# define __gthrw2(name,name2,type) \
8640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  static __typeof(type) name __attribute__ ((__weakref__(#name2))); \
8740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  __gthrw_pragma(weak type)
8840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh# define __gthrw_(name) __gthrw_ ## name
8940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#else
9040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh# define __gthrw2(name,name2,type)
9140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh# define __gthrw_(name) name
9240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
9340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
9440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* Typically, __gthrw_foo is a weak reference to symbol foo.  */
9540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __gthrw(name) __gthrw2(__gthrw_ ## name,name,name)
9640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
9740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* On Tru64, /usr/include/pthread.h uses #pragma extern_prefix "__" to
9840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   map a subset of the POSIX pthread API to mangled versions of their
9940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   names.  */
10040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if defined(__osf__) && defined(_PTHREAD_USE_MANGLED_NAMES_)
10140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#define __gthrw3(name) __gthrw2(__gthrw_ ## name, __ ## name, name)
10240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_once)
10340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_getspecific)
10440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_setspecific)
10540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
10640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_create)
10740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_join)
10840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_detach)
10940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_equal)
11040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_self)
11140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_cancel)
11240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(sched_yield)
11340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
11440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_mutex_lock)
11540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_mutex_trylock)
11640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_TIMEOUTS
11740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if _POSIX_TIMEOUTS >= 0
11840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_mutex_timedlock)
11940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
12040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _POSIX_TIMEOUTS */
12140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_mutex_unlock)
12240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_mutex_init)
12340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_mutex_destroy)
12440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
12540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_cond_broadcast)
12640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_cond_signal)
12740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_cond_wait)
12840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_cond_timedwait)
12940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_cond_destroy)
13040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#else
13140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_once)
13240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_getspecific)
13340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_setspecific)
13440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
13540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_create)
13640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_join)
13740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_equal)
13840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_self)
13940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_detach)
14040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifndef __BIONIC__
14140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_cancel)
14240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
14340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(sched_yield)
14440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
14540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_mutex_lock)
14640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_mutex_trylock)
14740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_TIMEOUTS
14840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if _POSIX_TIMEOUTS >= 0
14940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_mutex_timedlock)
15040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
15140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _POSIX_TIMEOUTS */
15240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_mutex_unlock)
15340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_mutex_init)
15440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_mutex_destroy)
15540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
15640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_cond_broadcast)
15740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_cond_signal)
15840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_cond_wait)
15940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_cond_timedwait)
16040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_cond_destroy)
16140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
16240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
16340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_key_create)
16440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_key_delete)
16540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_mutexattr_init)
16640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_mutexattr_settype)
16740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_mutexattr_destroy)
16840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
16940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
17040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)
17140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* Objective-C.  */
17240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if defined(__osf__) && defined(_PTHREAD_USE_MANGLED_NAMES_)
17340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_cond_init)
17440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw3(pthread_exit)
17540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#else
17640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_cond_init)
17740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_exit)
17840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* __osf__ && _PTHREAD_USE_MANGLED_NAMES_ */
17940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_PRIORITY_SCHEDULING
18040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
18140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(sched_get_priority_max)
18240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(sched_get_priority_min)
18340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
18440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _POSIX_PRIORITY_SCHEDULING */
18540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_attr_destroy)
18640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_attr_init)
18740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_attr_setdetachstate)
18840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
18940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_getschedparam)
19040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthrw(pthread_setschedparam)
19140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
19240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _LIBOBJC || _LIBOBJC_WEAK */
19340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
19440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if __GXX_WEAK__ && _GLIBCXX_GTHREAD_USE_WEAK
19540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
19640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* On Solaris 2.6 up to 9, the libc exposes a POSIX threads interface even if
19740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   -pthreads is not specified.  The functions are dummies and most return an
19840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   error value.  However pthread_once returns 0 without invoking the routine
19940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   it is passed so we cannot pretend that the interface is active if -pthreads
20040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   is not specified.  On Solaris 2.5.1, the interface is not exposed at all so
20140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   we need to play the usual game with weak symbols.  On Solaris 10 and up, a
20240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   working interface is always exposed.  On FreeBSD 6 and later, libc also
20340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   exposes a dummy POSIX threads interface, similar to what Solaris 2.6 up
20440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   to 9 does.  FreeBSD >= 700014 even provides a pthread_cancel stub in libc,
20540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   which means the alternate __gthread_active_p below cannot be used there.  */
20640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
20740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if defined(__FreeBSD__) || (defined(__sun) && defined(__svr4__))
20840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
20940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic volatile int __gthread_active = -1;
21040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
21140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic void
21240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_trigger (void)
21340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
21440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  __gthread_active = 1;
21540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
21640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
21740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
21840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_active_p (void)
21940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
22040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER;
22140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  static pthread_once_t __gthread_active_once = PTHREAD_ONCE_INIT;
22240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
22340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  /* Avoid reading __gthread_active twice on the main code path.  */
22440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  int __gthread_active_latest_value = __gthread_active;
22540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
22640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  /* This test is not protected to avoid taking a lock on the main code
22740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh     path so every update of __gthread_active in a threaded program must
22840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh     be atomic with regard to the result of the test.  */
22940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__builtin_expect (__gthread_active_latest_value < 0, 0))
23040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
23140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (__gthrw_(pthread_once))
23240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	{
23340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  /* If this really is a threaded program, then we must ensure that
23440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	     __gthread_active has been set to 1 before exiting this block.  */
23540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  __gthrw_(pthread_mutex_lock) (&__gthread_active_mutex);
23640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  __gthrw_(pthread_once) (&__gthread_active_once, __gthread_trigger);
23740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  __gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex);
23840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	}
23940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
24040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      /* Make sure we'll never enter this block again.  */
24140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (__gthread_active < 0)
24240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	__gthread_active = 0;
243cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
24440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      __gthread_active_latest_value = __gthread_active;
24540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
246cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
24740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthread_active_latest_value != 0;
24840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
24940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
25040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#else /* neither FreeBSD nor Solaris */
251cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
25240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
25340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_active_p (void)
25440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
25540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  static void *const __gthread_active_ptr
25640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    = __extension__ (void *) &__gthrw_(
25740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* Android's C library does not provide pthread_cancel, check for
25840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   `pthread_create' instead.  */
25940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifndef __BIONIC__
26040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh				       pthread_cancel
26140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#else
26240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh				       pthread_create
26340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
26440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh				       );
26540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthread_active_ptr != 0;
26640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
26740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
26840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* FreeBSD or Solaris */
26940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
27040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#else /* not __GXX_WEAK__ */
27140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
27240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* Similar to Solaris, HP-UX 11 for PA-RISC provides stubs for pthread
27340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   calls in shared flavors of the HP-UX C library.  Most of the stubs
27440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   have no functionality.  The details are described in the "libc cumulative
27540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   patch" for each subversion of HP-UX 11.  There are two special interfaces
27640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   provided for checking whether an application is linked to a shared pthread
27740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   library or not.  However, these interfaces aren't available in early
27840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   libpthread libraries.  We also need a test that works for archive
27940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   libraries.  We can't use pthread_once as some libc versions call the
28040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   init function.  We also can't use pthread_create or pthread_attr_init
28140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   as these create a thread and thereby prevent changing the default stack
28240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   size.  The function pthread_default_stacksize_np is available in both
28340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   the archive and shared versions of libpthread.   It can be used to
28440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   determine the default pthread stack size.  There is a stub in some
28540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   shared libc versions which returns a zero size if pthreads are not
28640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   active.  We provide an equivalent stub to handle cases where libc
28740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh   doesn't provide one.  */
28840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
28940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if defined(__hppa__) && defined(__hpux__)
29040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
29140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic volatile int __gthread_active = -1;
292cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
29340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
29440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_active_p (void)
29540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
29640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  /* Avoid reading __gthread_active twice on the main code path.  */
29740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  int __gthread_active_latest_value = __gthread_active;
29840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  size_t __s;
29940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
30040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__builtin_expect (__gthread_active_latest_value < 0, 0))
30140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
30240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      pthread_default_stacksize_np (0, &__s);
30340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      __gthread_active = __s ? 1 : 0;
30440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      __gthread_active_latest_value = __gthread_active;
30540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
30640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
30740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthread_active_latest_value != 0;
30840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
30940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
31040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#else /* not hppa-hpux */
31140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
31240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
31340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_active_p (void)
31440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
31540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return 1;
31640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
31740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
31840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* hppa-hpux */
31940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
32040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* __GXX_WEAK__ */
321cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
322cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh#ifdef _LIBOBJC
323cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
32440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* This is the config.h file in libobjc/ */
32540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#include <config.h>
32640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
32740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef HAVE_SCHED_H
32840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh# include <sched.h>
32940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
33040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
33140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh/* Key structure for maintaining thread specific storage */
33240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic pthread_key_t _objc_thread_storage;
33340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic pthread_attr_t _objc_thread_attribs;
33440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
335cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Thread local storage for a single thread */
336cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic void *thread_local_storage = NULL;
337cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
338cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Backend initialization functions */
339cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
340cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Initialize the threads subsystem.  */
341cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
342cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_objc_init_thread_system (void)
343cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
34440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
34540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
34640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      /* Initialize the thread storage key.  */
34740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (__gthrw_(pthread_key_create) (&_objc_thread_storage, NULL) == 0)
34840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	{
34940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  /* The normal default detach state for threads is
35040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	   * PTHREAD_CREATE_JOINABLE which causes threads to not die
35140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	   * when you think they should.  */
35240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  if (__gthrw_(pthread_attr_init) (&_objc_thread_attribs) == 0
35340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	      && __gthrw_(pthread_attr_setdetachstate) (&_objc_thread_attribs,
35440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh					      PTHREAD_CREATE_DETACHED) == 0)
35540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	    return 0;
35640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	}
35740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
35840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
359cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return -1;
360cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
361cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
362cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Close the threads subsystem.  */
363cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
364cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_objc_close_thread_system (void)
365cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
36640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ()
36740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      && __gthrw_(pthread_key_delete) (_objc_thread_storage) == 0
36840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      && __gthrw_(pthread_attr_destroy) (&_objc_thread_attribs) == 0)
36940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return 0;
37040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
371cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return -1;
372cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
373cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
374cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Backend thread functions */
375cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
376cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Create a new thread of execution.  */
377cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline objc_thread_t
37840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_thread_detach (void (*func)(void *), void *arg)
379cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
38040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  objc_thread_t thread_id;
38140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  pthread_t new_thread_handle;
38240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
38340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (!__gthread_active_p ())
38440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return NULL;
38540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
38640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (!(__gthrw_(pthread_create) (&new_thread_handle, &_objc_thread_attribs,
38740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh				  (void *) func, arg)))
38840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    thread_id = (objc_thread_t) new_thread_handle;
38940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
39040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    thread_id = NULL;
39140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
39240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return thread_id;
393cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
394cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
395cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Set the current thread's priority.  */
396cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
39740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_thread_set_priority (int priority)
39840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
39940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (!__gthread_active_p ())
40040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return -1;
40140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
40240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
40340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_PRIORITY_SCHEDULING
40440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
40540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      pthread_t thread_id = __gthrw_(pthread_self) ();
40640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      int policy;
40740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      struct sched_param params;
40840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      int priority_min, priority_max;
40940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
41040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (__gthrw_(pthread_getschedparam) (thread_id, &policy, &params) == 0)
41140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	{
41240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  if ((priority_max = __gthrw_(sched_get_priority_max) (policy)) == -1)
41340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	    return -1;
41440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
41540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  if ((priority_min = __gthrw_(sched_get_priority_min) (policy)) == -1)
41640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	    return -1;
41740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
41840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  if (priority > priority_max)
41940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	    priority = priority_max;
42040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  else if (priority < priority_min)
42140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	    priority = priority_min;
42240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  params.sched_priority = priority;
42340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
42440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  /*
42540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	   * The solaris 7 and several other man pages incorrectly state that
42640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	   * this should be a pointer to policy but pthread.h is universally
42740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	   * at odds with this.
42840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	   */
42940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  if (__gthrw_(pthread_setschedparam) (thread_id, policy, &params) == 0)
43040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	    return 0;
43140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	}
43240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
43340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _POSIX_PRIORITY_SCHEDULING */
43440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      return -1;
43540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
436cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
437cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
438cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Return the current thread's priority.  */
439cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
440cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_objc_thread_get_priority (void)
441cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
44240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_PRIORITY_SCHEDULING
44340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
44440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
44540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
44640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      int policy;
44740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      struct sched_param params;
44840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
44940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (__gthrw_(pthread_getschedparam) (__gthrw_(pthread_self) (), &policy, &params) == 0)
45040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	return params.sched_priority;
45140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      else
45240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	return -1;
45340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
45440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
45540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
45640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _POSIX_PRIORITY_SCHEDULING */
45740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return OBJC_THREAD_INTERACTIVE_PRIORITY;
458cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
459cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
460cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Yield our process time to another thread.  */
461cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline void
462cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_objc_thread_yield (void)
463cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
46440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
46540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    __gthrw_(sched_yield) ();
466cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
467cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
468cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Terminate the current thread.  */
469cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
470cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_objc_thread_exit (void)
471cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
47240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
47340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    /* exit the thread */
47440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    __gthrw_(pthread_exit) (&__objc_thread_exit_status);
47540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
47640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  /* Failed if we reached here */
477cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return -1;
478cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
479cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
480cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Returns an integer value which uniquely describes a thread.  */
481cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline objc_thread_t
482cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_objc_thread_id (void)
483cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
48440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
48540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return (objc_thread_t) __gthrw_(pthread_self) ();
48640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
48740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return (objc_thread_t) 1;
488cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
489cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
490cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Sets the thread's local storage pointer.  */
491cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
492cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_objc_thread_set_data (void *value)
493cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
49440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
49540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_setspecific) (_objc_thread_storage, value);
49640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
49740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
49840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      thread_local_storage = value;
49940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      return 0;
50040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
501cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
502cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
503cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Returns the thread's local storage pointer.  */
504cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline void *
505cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_objc_thread_get_data (void)
506cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
50740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
50840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_getspecific) (_objc_thread_storage);
50940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
51040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return thread_local_storage;
511cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
512cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
513cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Backend mutex functions */
514cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
515cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Allocate a mutex.  */
516cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
51740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_mutex_allocate (objc_mutex_t mutex)
518cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
51940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
52040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
52140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      mutex->backend = objc_malloc (sizeof (pthread_mutex_t));
52240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
52340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (__gthrw_(pthread_mutex_init) ((pthread_mutex_t *) mutex->backend, NULL))
52440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	{
52540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  objc_free (mutex->backend);
52640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  mutex->backend = NULL;
52740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  return -1;
52840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	}
52940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
53040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
531cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return 0;
532cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
533cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
534cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Deallocate a mutex.  */
535cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
53640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_mutex_deallocate (objc_mutex_t mutex)
53740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
53840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
53940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
54040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      int count;
54140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
54240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      /*
54340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh       * Posix Threads specifically require that the thread be unlocked
54440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh       * for __gthrw_(pthread_mutex_destroy) to work.
54540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh       */
54640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
54740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      do
54840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	{
54940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  count = __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend);
55040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  if (count < 0)
55140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	    return -1;
55240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	}
55340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      while (count);
55440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
55540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (__gthrw_(pthread_mutex_destroy) ((pthread_mutex_t *) mutex->backend))
55640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	return -1;
55740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
55840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      objc_free (mutex->backend);
55940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      mutex->backend = NULL;
56040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
561cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return 0;
562cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
563cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
564cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Grab a lock on a mutex.  */
565cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
56640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_mutex_lock (objc_mutex_t mutex)
567cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
56840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ()
56940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      && __gthrw_(pthread_mutex_lock) ((pthread_mutex_t *) mutex->backend) != 0)
57040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
57140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      return -1;
57240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
57340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
574cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return 0;
575cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
576cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
577cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Try to grab a lock on a mutex.  */
578cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
57940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_mutex_trylock (objc_mutex_t mutex)
580cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
58140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ()
58240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      && __gthrw_(pthread_mutex_trylock) ((pthread_mutex_t *) mutex->backend) != 0)
58340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
58440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      return -1;
58540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
58640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
587cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return 0;
588cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
589cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
590cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Unlock the mutex */
591cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
59240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_mutex_unlock (objc_mutex_t mutex)
593cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
59440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ()
59540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      && __gthrw_(pthread_mutex_unlock) ((pthread_mutex_t *) mutex->backend) != 0)
59640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
59740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      return -1;
59840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
59940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
600cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return 0;
601cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
602cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
603cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Backend condition mutex functions */
604cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
605cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Allocate a condition.  */
606cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
60740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_condition_allocate (objc_condition_t condition)
608cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
60940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
61040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
61140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      condition->backend = objc_malloc (sizeof (pthread_cond_t));
61240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
61340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (__gthrw_(pthread_cond_init) ((pthread_cond_t *) condition->backend, NULL))
61440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	{
61540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  objc_free (condition->backend);
61640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  condition->backend = NULL;
61740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	  return -1;
61840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	}
61940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
62040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
621cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return 0;
622cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
623cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
624cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Deallocate a condition.  */
625cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
62640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_condition_deallocate (objc_condition_t condition)
627cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
62840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
62940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
63040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (__gthrw_(pthread_cond_destroy) ((pthread_cond_t *) condition->backend))
63140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	return -1;
63240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
63340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      objc_free (condition->backend);
63440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      condition->backend = NULL;
63540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
636cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return 0;
637cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
638cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
639cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Wait on the condition */
640cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
64140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex)
642cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
64340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
64440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_cond_wait) ((pthread_cond_t *) condition->backend,
64540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh			      (pthread_mutex_t *) mutex->backend);
64640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
64740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return 0;
648cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
649cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
650cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Wake up all threads waiting on this condition.  */
651cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
65240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_condition_broadcast (objc_condition_t condition)
653cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
65440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
65540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_cond_broadcast) ((pthread_cond_t *) condition->backend);
65640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
65740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return 0;
658cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
659cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
660cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh/* Wake up one thread waiting on this condition.  */
661cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
66240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_objc_condition_signal (objc_condition_t condition)
663cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
66440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
66540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_cond_signal) ((pthread_cond_t *) condition->backend);
66640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
66740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return 0;
668cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
669cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
670cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh#else /* _LIBOBJC */
671cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
672cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
67340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_create (__gthread_t *__threadid, void *(*__func) (void*),
67440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh		  void *__args)
675cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
67640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_create) (__threadid, NULL, __func, __args);
677cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
678cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
6798a0cbe1bcb3e605f194c79c014c4ee5ef6047528Andrew Hsiehstatic inline int
68040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_join (__gthread_t __threadid, void **__value_ptr)
681cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
68240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_join) (__threadid, __value_ptr);
683cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
6848a0cbe1bcb3e605f194c79c014c4ee5ef6047528Andrew Hsieh
68540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
68640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_detach (__gthread_t __threadid)
687cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
68840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_detach) (__threadid);
689cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
690cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
69140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
69240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_equal (__gthread_t __t1, __gthread_t __t2)
693cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
69440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_equal) (__t1, __t2);
69540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
69640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
69740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline __gthread_t
69840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_self (void)
69940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
70040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_self) ();
70140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
70240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
70340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
70440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_yield (void)
70540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
70640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(sched_yield) ();
70740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
70840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
70940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
71040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_once (__gthread_once_t *__once, void (*__func) (void))
71140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
71240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
71340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_once) (__once, __func);
71440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
71540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return -1;
71640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
71740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
71840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
71940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_key_create (__gthread_key_t *__key, void (*__dtor) (void *))
72040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
72140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_key_create) (__key, __dtor);
72240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
72340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
72440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
72540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_key_delete (__gthread_key_t __key)
72640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
72740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_key_delete) (__key);
728cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
7298a0cbe1bcb3e605f194c79c014c4ee5ef6047528Andrew Hsieh
730cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline void *
73140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_getspecific (__gthread_key_t __key)
732cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
73340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_getspecific) (__key);
734cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
735cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
7368a0cbe1bcb3e605f194c79c014c4ee5ef6047528Andrew Hsiehstatic inline int
73740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_setspecific (__gthread_key_t __key, const void *__ptr)
738cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
73940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_setspecific) (__key, __ptr);
740cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
741cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
742cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
74340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_mutex_destroy (__gthread_mutex_t *__mutex)
744cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
74540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
74640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_mutex_destroy) (__mutex);
74740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
74840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return 0;
749cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
750cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
751cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
75240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_mutex_lock (__gthread_mutex_t *__mutex)
753cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
75440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
75540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_mutex_lock) (__mutex);
75640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
75740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return 0;
758cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
759cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
760cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
76140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_mutex_trylock (__gthread_mutex_t *__mutex)
762cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
76340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
76440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_mutex_trylock) (__mutex);
76540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
76640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return 0;
767cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
768cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
76940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_TIMEOUTS
77040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if _POSIX_TIMEOUTS >= 0
771cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
77240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_mutex_timedlock (__gthread_mutex_t *__mutex,
77340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh			   const __gthread_time_t *__abs_timeout)
774cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
77540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
77640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_mutex_timedlock) (__mutex, __abs_timeout);
77740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
77840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return 0;
77940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
78040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
78140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
78240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
78340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
78440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_mutex_unlock (__gthread_mutex_t *__mutex)
78540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
78640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
78740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return __gthrw_(pthread_mutex_unlock) (__mutex);
78840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  else
78940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    return 0;
79040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
79140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
79240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifndef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
79340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
79440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex)
79540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
79640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  if (__gthread_active_p ())
79740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    {
79840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      pthread_mutexattr_t __attr;
79940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      int __r;
80040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
80140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      __r = __gthrw_(pthread_mutexattr_init) (&__attr);
80240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (!__r)
80340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	__r = __gthrw_(pthread_mutexattr_settype) (&__attr,
80440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh						   PTHREAD_MUTEX_RECURSIVE);
80540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (!__r)
80640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	__r = __gthrw_(pthread_mutex_init) (__mutex, &__attr);
80740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      if (!__r)
80840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh	__r = __gthrw_(pthread_mutexattr_destroy) (&__attr);
80940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh      return __r;
81040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh    }
811cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return 0;
812cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
81340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
814cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
815cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
816cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex)
817cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
818cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return __gthread_mutex_lock (__mutex);
819cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
820cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
821cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
822cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex)
823cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
824cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return __gthread_mutex_trylock (__mutex);
825cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
826cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
82740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#ifdef _POSIX_TIMEOUTS
82840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#if _POSIX_TIMEOUTS >= 0
82940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
83040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_recursive_mutex_timedlock (__gthread_recursive_mutex_t *__mutex,
83140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh				     const __gthread_time_t *__abs_timeout)
83240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
83340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthread_mutex_timedlock (__mutex, __abs_timeout);
83440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
83540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
83640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif
83740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
838cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsiehstatic inline int
839cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex)
840cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh{
841cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh  return __gthread_mutex_unlock (__mutex);
842cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh}
843cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
84440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
84540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_cond_broadcast (__gthread_cond_t *__cond)
84640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
84740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_cond_broadcast) (__cond);
84840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
84940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
85040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
85140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_cond_signal (__gthread_cond_t *__cond)
85240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
85340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_cond_signal) (__cond);
85440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
85540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
85640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
85740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_cond_wait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex)
85840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
85940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_cond_wait) (__cond, __mutex);
86040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
86140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
86240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
86340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_cond_timedwait (__gthread_cond_t *__cond, __gthread_mutex_t *__mutex,
86440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh			  const __gthread_time_t *__abs_timeout)
86540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
86640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_cond_timedwait) (__cond, __mutex, __abs_timeout);
86740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
86840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
86940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
87040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_cond_wait_recursive (__gthread_cond_t *__cond,
87140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh			       __gthread_recursive_mutex_t *__mutex)
87240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
87340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthread_cond_wait (__cond, __mutex);
87440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
875cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
87640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
87740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_cond_timedwait_recursive (__gthread_cond_t *__cond,
87840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh				    __gthread_recursive_mutex_t *__mutex,
87940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh				    const __gthread_time_t *__abs_timeout)
88040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
88140932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthread_cond_timedwait (__cond, __mutex, __abs_timeout);
88240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
88340932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
88440932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsiehstatic inline int
88540932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh__gthread_cond_destroy (__gthread_cond_t* __cond)
88640932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh{
88740932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh  return __gthrw_(pthread_cond_destroy) (__cond);
88840932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh}
88940932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh
89040932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* _LIBOBJC */
891cd89a9be3397dfc6416835b3f1cbe37b3e5b605bAndrew Hsieh
89240932ab82f04b0877bca16eaa3f5f9124168b37eAndrew Hsieh#endif /* ! _GLIBCXX_GCC_GTHR_POSIX_H */
893