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, ¶ms) == 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, ¶ms) == 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, ¶ms) == 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