1c7e4239fSAsiri Rathnayake// -*- C++ -*- 2c7e4239fSAsiri Rathnayake//===----------------------------------------------------------------------===// 3c7e4239fSAsiri Rathnayake// 4c7e4239fSAsiri Rathnayake// The LLVM Compiler Infrastructure 5c7e4239fSAsiri Rathnayake// 6c7e4239fSAsiri Rathnayake// This file is dual licensed under the MIT and the University of Illinois Open 7c7e4239fSAsiri Rathnayake// Source Licenses. See LICENSE.TXT for details. 8c7e4239fSAsiri Rathnayake// 9c7e4239fSAsiri Rathnayake//===----------------------------------------------------------------------===// 10c7e4239fSAsiri Rathnayake 11c7e4239fSAsiri Rathnayake#ifndef _LIBCPP_THREADING_SUPPORT 12c7e4239fSAsiri Rathnayake#define _LIBCPP_THREADING_SUPPORT 13c7e4239fSAsiri Rathnayake 14c7e4239fSAsiri Rathnayake#include <__config> 15c7e4239fSAsiri Rathnayake 16c7e4239fSAsiri Rathnayake#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER 17c7e4239fSAsiri Rathnayake#pragma GCC system_header 18c7e4239fSAsiri Rathnayake#endif 19c7e4239fSAsiri Rathnayake 20c7e4239fSAsiri Rathnayake#ifndef _LIBCPP_HAS_NO_THREADS 21c7e4239fSAsiri Rathnayake 223cf2f7bcSAsiri Rathnayake#ifndef __libcpp_has_include 233cf2f7bcSAsiri Rathnayake #ifndef __has_include 243cf2f7bcSAsiri Rathnayake #define __libcpp_has_include(x) 0 253cf2f7bcSAsiri Rathnayake #else 263cf2f7bcSAsiri Rathnayake #define __libcpp_has_include(x) __has_include(x) 27d547ac0dSAsiri Rathnayake #endif 28d547ac0dSAsiri Rathnayake#endif 29d547ac0dSAsiri Rathnayake 303cf2f7bcSAsiri Rathnayake#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) && \ 316cb0d41cSAsiri Rathnayake !__libcpp_has_include(<__external_threading>) 326cb0d41cSAsiri Rathnayake// If the <__external_threading> header is absent, build libc++ against a 336cb0d41cSAsiri Rathnayake// pthread-oriented thread api but leave out its implementation. This setup 346cb0d41cSAsiri Rathnayake// allows building+testing of an externally-threaded library variant (on any 356cb0d41cSAsiri Rathnayake// platform that supports pthreads). Here, an 'externally-threaded' library 366cb0d41cSAsiri Rathnayake// variant is one where the implementation of the libc++ thread api is provided 376cb0d41cSAsiri Rathnayake// as a separate library. 386cb0d41cSAsiri Rathnayake#define _LIBCPP_HAS_THREAD_API_EXTERNAL_PTHREAD 396cb0d41cSAsiri Rathnayake#endif 406cb0d41cSAsiri Rathnayake 416cb0d41cSAsiri Rathnayake#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) && \ 423cf2f7bcSAsiri Rathnayake __libcpp_has_include(<__external_threading>) 433cf2f7bcSAsiri Rathnayake#include <__external_threading> 443cf2f7bcSAsiri Rathnayake#else 45790e10f6SSaleem Abdulrasool 466cb0d41cSAsiri Rathnayake#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \ 476cb0d41cSAsiri Rathnayake defined(_LIBCPP_HAS_THREAD_API_EXTERNAL_PTHREAD) 48c7e4239fSAsiri Rathnayake#include <pthread.h> 49c7e4239fSAsiri Rathnayake#include <sched.h> 50790e10f6SSaleem Abdulrasool#endif 51c7e4239fSAsiri Rathnayake 528c2bf45dSAsiri Rathnayake#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) 538c2bf45dSAsiri Rathnayake#define _LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_FUNC_VIS 548c2bf45dSAsiri Rathnayake#else 558c2bf45dSAsiri Rathnayake#define _LIBCPP_THREAD_ABI_VISIBILITY inline _LIBCPP_INLINE_VISIBILITY 568c2bf45dSAsiri Rathnayake#endif 578c2bf45dSAsiri Rathnayake 58c7e4239fSAsiri Rathnayake_LIBCPP_BEGIN_NAMESPACE_STD 59c7e4239fSAsiri Rathnayake 606cb0d41cSAsiri Rathnayake#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \ 616cb0d41cSAsiri Rathnayake defined(_LIBCPP_HAS_THREAD_API_EXTERNAL_PTHREAD) 62c7e4239fSAsiri Rathnayake// Mutex 63c7e4239fSAsiri Rathnayaketypedef pthread_mutex_t __libcpp_mutex_t; 648c2bf45dSAsiri Rathnayake#define _LIBCPP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER 65c7e4239fSAsiri Rathnayake 66*58a0dceeSSaleem Abdulrasooltypedef pthread_mutex_t __libcpp_recursive_mutex_t; 67*58a0dceeSSaleem Abdulrasool 68790e10f6SSaleem Abdulrasool// Condition Variable 69790e10f6SSaleem Abdulrasooltypedef pthread_cond_t __libcpp_condvar_t; 70790e10f6SSaleem Abdulrasool#define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER 71790e10f6SSaleem Abdulrasool 72205d7d3fSAsiri Rathnayake// Execute once 73205d7d3fSAsiri Rathnayaketypedef pthread_once_t __libcpp_exec_once_flag; 74205d7d3fSAsiri Rathnayake#define _LIBCPP_EXEC_ONCE_INITIALIZER PTHREAD_ONCE_INIT 75205d7d3fSAsiri Rathnayake 76205d7d3fSAsiri Rathnayake// Thread id 77790e10f6SSaleem Abdulrasooltypedef pthread_t __libcpp_thread_id; 78790e10f6SSaleem Abdulrasool 79790e10f6SSaleem Abdulrasool// Thread 80790e10f6SSaleem Abdulrasooltypedef pthread_t __libcpp_thread_t; 81790e10f6SSaleem Abdulrasool 82790e10f6SSaleem Abdulrasool// Thrad Local Storage 83790e10f6SSaleem Abdulrasooltypedef pthread_key_t __libcpp_tls_key; 84790e10f6SSaleem Abdulrasool#endif 85790e10f6SSaleem Abdulrasool 86790e10f6SSaleem Abdulrasool// Mutex 878c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 88*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m); 89*58a0dceeSSaleem Abdulrasool 90*58a0dceeSSaleem Abdulrasool_LIBCPP_THREAD_ABI_VISIBILITY 91*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t *__m); 92*58a0dceeSSaleem Abdulrasool 93*58a0dceeSSaleem Abdulrasool_LIBCPP_THREAD_ABI_VISIBILITY 94*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t *__m); 95*58a0dceeSSaleem Abdulrasool 96*58a0dceeSSaleem Abdulrasool_LIBCPP_THREAD_ABI_VISIBILITY 97*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_unlock(__libcpp_recursive_mutex_t *__m); 98*58a0dceeSSaleem Abdulrasool 99*58a0dceeSSaleem Abdulrasool_LIBCPP_THREAD_ABI_VISIBILITY 100*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t *__m); 101790e10f6SSaleem Abdulrasool 1028c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1038c2bf45dSAsiri Rathnayakeint __libcpp_mutex_lock(__libcpp_mutex_t *__m); 104790e10f6SSaleem Abdulrasool 1058c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1068c2bf45dSAsiri Rathnayakeint __libcpp_mutex_trylock(__libcpp_mutex_t *__m); 107790e10f6SSaleem Abdulrasool 1088c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1098c2bf45dSAsiri Rathnayakeint __libcpp_mutex_unlock(__libcpp_mutex_t *__m); 110790e10f6SSaleem Abdulrasool 1118c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1128c2bf45dSAsiri Rathnayakeint __libcpp_mutex_destroy(__libcpp_mutex_t *__m); 1138c2bf45dSAsiri Rathnayake 1148c2bf45dSAsiri Rathnayake// Condition variable 1158c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1168c2bf45dSAsiri Rathnayakeint __libcpp_condvar_signal(__libcpp_condvar_t* __cv); 117790e10f6SSaleem Abdulrasool 1188c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1198c2bf45dSAsiri Rathnayakeint __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv); 120790e10f6SSaleem Abdulrasool 1218c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1228c2bf45dSAsiri Rathnayakeint __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m); 123790e10f6SSaleem Abdulrasool 1248c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 125790e10f6SSaleem Abdulrasoolint __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m, 126790e10f6SSaleem Abdulrasool timespec *__ts); 127790e10f6SSaleem Abdulrasool 1288c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1298c2bf45dSAsiri Rathnayakeint __libcpp_condvar_destroy(__libcpp_condvar_t* __cv); 1308c2bf45dSAsiri Rathnayake 131205d7d3fSAsiri Rathnayake// Execute once 132205d7d3fSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 133205d7d3fSAsiri Rathnayakeint __libcpp_execute_once(__libcpp_exec_once_flag *flag, 134205d7d3fSAsiri Rathnayake void (*init_routine)(void)); 135205d7d3fSAsiri Rathnayake 136205d7d3fSAsiri Rathnayake// Thread id 137205d7d3fSAsiri Rathnayake#if defined(__APPLE__) && !defined(__arm__) 138205d7d3fSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 139205d7d3fSAsiri Rathnayakemach_port_t __libcpp_thread_get_port(); 140205d7d3fSAsiri Rathnayake#endif 141205d7d3fSAsiri Rathnayake 1428c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1438c2bf45dSAsiri Rathnayakebool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2); 144790e10f6SSaleem Abdulrasool 1458c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1468c2bf45dSAsiri Rathnayakebool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2); 1478c2bf45dSAsiri Rathnayake 1488c2bf45dSAsiri Rathnayake// Thread 1498c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 150790e10f6SSaleem Abdulrasoolint __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *), 151790e10f6SSaleem Abdulrasool void *__arg); 152790e10f6SSaleem Abdulrasool 1538c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1548c2bf45dSAsiri Rathnayake__libcpp_thread_id __libcpp_thread_get_current_id(); 155790e10f6SSaleem Abdulrasool 1568c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1578c2bf45dSAsiri Rathnayake__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t); 158790e10f6SSaleem Abdulrasool 1598c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1608c2bf45dSAsiri Rathnayakeint __libcpp_thread_join(__libcpp_thread_t *__t); 161790e10f6SSaleem Abdulrasool 1628c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1638c2bf45dSAsiri Rathnayakeint __libcpp_thread_detach(__libcpp_thread_t *__t); 164790e10f6SSaleem Abdulrasool 1658c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1668c2bf45dSAsiri Rathnayakevoid __libcpp_thread_yield(); 1678c2bf45dSAsiri Rathnayake 1688c2bf45dSAsiri Rathnayake// Thread local storage 1698c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1708c2bf45dSAsiri Rathnayakeint __libcpp_tls_create(__libcpp_tls_key *__key, void (*__at_exit)(void *)); 171790e10f6SSaleem Abdulrasool 1728c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1738c2bf45dSAsiri Rathnayakevoid *__libcpp_tls_get(__libcpp_tls_key __key); 174790e10f6SSaleem Abdulrasool 1758c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 176205d7d3fSAsiri Rathnayakeint __libcpp_tls_set(__libcpp_tls_key __key, void *__p); 1778c2bf45dSAsiri Rathnayake 1786cb0d41cSAsiri Rathnayake#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \ 1796cb0d41cSAsiri Rathnayake defined(_LIBCPP_BUILDING_THREAD_API_EXTERNAL_PTHREAD) 1808c2bf45dSAsiri Rathnayake 181*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m) 182c7e4239fSAsiri Rathnayake{ 183c7e4239fSAsiri Rathnayake pthread_mutexattr_t attr; 184c7e4239fSAsiri Rathnayake int __ec = pthread_mutexattr_init(&attr); 185c7e4239fSAsiri Rathnayake if (__ec) 186790e10f6SSaleem Abdulrasool return __ec; 187790e10f6SSaleem Abdulrasool __ec = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); 188790e10f6SSaleem Abdulrasool if (__ec) { 189c7e4239fSAsiri Rathnayake pthread_mutexattr_destroy(&attr); 190c7e4239fSAsiri Rathnayake return __ec; 191c7e4239fSAsiri Rathnayake } 192c7e4239fSAsiri Rathnayake __ec = pthread_mutex_init(__m, &attr); 193790e10f6SSaleem Abdulrasool if (__ec) { 194c7e4239fSAsiri Rathnayake pthread_mutexattr_destroy(&attr); 195c7e4239fSAsiri Rathnayake return __ec; 196c7e4239fSAsiri Rathnayake } 197c7e4239fSAsiri Rathnayake __ec = pthread_mutexattr_destroy(&attr); 198790e10f6SSaleem Abdulrasool if (__ec) { 199c7e4239fSAsiri Rathnayake pthread_mutex_destroy(__m); 200c7e4239fSAsiri Rathnayake return __ec; 201c7e4239fSAsiri Rathnayake } 202c7e4239fSAsiri Rathnayake return 0; 203c7e4239fSAsiri Rathnayake} 204c7e4239fSAsiri Rathnayake 205*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t *__m) 206*58a0dceeSSaleem Abdulrasool{ 207*58a0dceeSSaleem Abdulrasool return pthread_mutex_lock(__m); 208*58a0dceeSSaleem Abdulrasool} 209*58a0dceeSSaleem Abdulrasool 210*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t *__m) 211*58a0dceeSSaleem Abdulrasool{ 212*58a0dceeSSaleem Abdulrasool return pthread_mutex_trylock(__m); 213*58a0dceeSSaleem Abdulrasool} 214*58a0dceeSSaleem Abdulrasool 215*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_unlock(__libcpp_mutex_t *__m) 216*58a0dceeSSaleem Abdulrasool{ 217*58a0dceeSSaleem Abdulrasool return pthread_mutex_unlock(__m); 218*58a0dceeSSaleem Abdulrasool} 219*58a0dceeSSaleem Abdulrasool 220*58a0dceeSSaleem Abdulrasoolint __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t *__m) 221*58a0dceeSSaleem Abdulrasool{ 222*58a0dceeSSaleem Abdulrasool return pthread_mutex_destroy(__m); 223*58a0dceeSSaleem Abdulrasool} 224*58a0dceeSSaleem Abdulrasool 225c7e4239fSAsiri Rathnayakeint __libcpp_mutex_lock(__libcpp_mutex_t *__m) 226c7e4239fSAsiri Rathnayake{ 227c7e4239fSAsiri Rathnayake return pthread_mutex_lock(__m); 228c7e4239fSAsiri Rathnayake} 229c7e4239fSAsiri Rathnayake 230c7e4239fSAsiri Rathnayakeint __libcpp_mutex_trylock(__libcpp_mutex_t *__m) 231c7e4239fSAsiri Rathnayake{ 232c7e4239fSAsiri Rathnayake return pthread_mutex_trylock(__m); 233c7e4239fSAsiri Rathnayake} 234c7e4239fSAsiri Rathnayake 235c7e4239fSAsiri Rathnayakeint __libcpp_mutex_unlock(__libcpp_mutex_t *__m) 236c7e4239fSAsiri Rathnayake{ 237c7e4239fSAsiri Rathnayake return pthread_mutex_unlock(__m); 238c7e4239fSAsiri Rathnayake} 239c7e4239fSAsiri Rathnayake 240c7e4239fSAsiri Rathnayakeint __libcpp_mutex_destroy(__libcpp_mutex_t *__m) 241c7e4239fSAsiri Rathnayake{ 242c7e4239fSAsiri Rathnayake return pthread_mutex_destroy(__m); 243c7e4239fSAsiri Rathnayake} 244c7e4239fSAsiri Rathnayake 245790e10f6SSaleem Abdulrasool// Condition Variable 246c7e4239fSAsiri Rathnayakeint __libcpp_condvar_signal(__libcpp_condvar_t *__cv) 247c7e4239fSAsiri Rathnayake{ 248c7e4239fSAsiri Rathnayake return pthread_cond_signal(__cv); 249c7e4239fSAsiri Rathnayake} 250c7e4239fSAsiri Rathnayake 251c7e4239fSAsiri Rathnayakeint __libcpp_condvar_broadcast(__libcpp_condvar_t *__cv) 252c7e4239fSAsiri Rathnayake{ 253c7e4239fSAsiri Rathnayake return pthread_cond_broadcast(__cv); 254c7e4239fSAsiri Rathnayake} 255c7e4239fSAsiri Rathnayake 256c7e4239fSAsiri Rathnayakeint __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m) 257c7e4239fSAsiri Rathnayake{ 258c7e4239fSAsiri Rathnayake return pthread_cond_wait(__cv, __m); 259c7e4239fSAsiri Rathnayake} 260c7e4239fSAsiri Rathnayake 261790e10f6SSaleem Abdulrasoolint __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m, 262790e10f6SSaleem Abdulrasool timespec *__ts) 263c7e4239fSAsiri Rathnayake{ 264c7e4239fSAsiri Rathnayake return pthread_cond_timedwait(__cv, __m, __ts); 265c7e4239fSAsiri Rathnayake} 266c7e4239fSAsiri Rathnayake 267c7e4239fSAsiri Rathnayakeint __libcpp_condvar_destroy(__libcpp_condvar_t *__cv) 268c7e4239fSAsiri Rathnayake{ 269c7e4239fSAsiri Rathnayake return pthread_cond_destroy(__cv); 270c7e4239fSAsiri Rathnayake} 271c7e4239fSAsiri Rathnayake 272205d7d3fSAsiri Rathnayake// Execute once 273205d7d3fSAsiri Rathnayakeint __libcpp_execute_once(__libcpp_exec_once_flag *flag, 274205d7d3fSAsiri Rathnayake void (*init_routine)(void)) { 275205d7d3fSAsiri Rathnayake return pthread_once(flag, init_routine); 276205d7d3fSAsiri Rathnayake} 277205d7d3fSAsiri Rathnayake 278205d7d3fSAsiri Rathnayake// Thread id 279205d7d3fSAsiri Rathnayake#if defined(__APPLE__) && !defined(__arm__) 280205d7d3fSAsiri Rathnayakemach_port_t __libcpp_thread_get_port() { 281205d7d3fSAsiri Rathnayake return pthread_mach_thread_np(pthread_self()); 282205d7d3fSAsiri Rathnayake} 283205d7d3fSAsiri Rathnayake#endif 284205d7d3fSAsiri Rathnayake 285c7e4239fSAsiri Rathnayake// Returns non-zero if the thread ids are equal, otherwise 0 286c7e4239fSAsiri Rathnayakebool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2) 287c7e4239fSAsiri Rathnayake{ 288c7e4239fSAsiri Rathnayake return pthread_equal(t1, t2) != 0; 289c7e4239fSAsiri Rathnayake} 290c7e4239fSAsiri Rathnayake 291c7e4239fSAsiri Rathnayake// Returns non-zero if t1 < t2, otherwise 0 292c7e4239fSAsiri Rathnayakebool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2) 293c7e4239fSAsiri Rathnayake{ 294c7e4239fSAsiri Rathnayake return t1 < t2; 295c7e4239fSAsiri Rathnayake} 296c7e4239fSAsiri Rathnayake 297c7e4239fSAsiri Rathnayake// Thread 298790e10f6SSaleem Abdulrasoolint __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *), 299790e10f6SSaleem Abdulrasool void *__arg) 300c7e4239fSAsiri Rathnayake{ 301c7e4239fSAsiri Rathnayake return pthread_create(__t, 0, __func, __arg); 302c7e4239fSAsiri Rathnayake} 303c7e4239fSAsiri Rathnayake 304c7e4239fSAsiri Rathnayake__libcpp_thread_id __libcpp_thread_get_current_id() 305c7e4239fSAsiri Rathnayake{ 306c7e4239fSAsiri Rathnayake return pthread_self(); 307c7e4239fSAsiri Rathnayake} 308c7e4239fSAsiri Rathnayake 309c7e4239fSAsiri Rathnayake__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t) 310c7e4239fSAsiri Rathnayake{ 311c7e4239fSAsiri Rathnayake return *__t; 312c7e4239fSAsiri Rathnayake} 313c7e4239fSAsiri Rathnayake 314c7e4239fSAsiri Rathnayakeint __libcpp_thread_join(__libcpp_thread_t *__t) 315c7e4239fSAsiri Rathnayake{ 316c7e4239fSAsiri Rathnayake return pthread_join(*__t, 0); 317c7e4239fSAsiri Rathnayake} 318c7e4239fSAsiri Rathnayake 319c7e4239fSAsiri Rathnayakeint __libcpp_thread_detach(__libcpp_thread_t *__t) 320c7e4239fSAsiri Rathnayake{ 321c7e4239fSAsiri Rathnayake return pthread_detach(*__t); 322c7e4239fSAsiri Rathnayake} 323c7e4239fSAsiri Rathnayake 324c7e4239fSAsiri Rathnayakevoid __libcpp_thread_yield() 325c7e4239fSAsiri Rathnayake{ 326c7e4239fSAsiri Rathnayake sched_yield(); 327c7e4239fSAsiri Rathnayake} 328c7e4239fSAsiri Rathnayake 329c7e4239fSAsiri Rathnayake// Thread local storage 3308c2bf45dSAsiri Rathnayakeint __libcpp_tls_create(__libcpp_tls_key *__key, void (*__at_exit)(void *)) 331c7e4239fSAsiri Rathnayake{ 332c7e4239fSAsiri Rathnayake return pthread_key_create(__key, __at_exit); 333c7e4239fSAsiri Rathnayake} 334c7e4239fSAsiri Rathnayake 3358c2bf45dSAsiri Rathnayakevoid *__libcpp_tls_get(__libcpp_tls_key __key) 336c7e4239fSAsiri Rathnayake{ 337c7e4239fSAsiri Rathnayake return pthread_getspecific(__key); 338c7e4239fSAsiri Rathnayake} 339c7e4239fSAsiri Rathnayake 340205d7d3fSAsiri Rathnayakeint __libcpp_tls_set(__libcpp_tls_key __key, void *__p) 341c7e4239fSAsiri Rathnayake{ 342205d7d3fSAsiri Rathnayake return pthread_setspecific(__key, __p); 343c7e4239fSAsiri Rathnayake} 344c7e4239fSAsiri Rathnayake 345790e10f6SSaleem Abdulrasool#endif // _LIBCPP_HAS_THREAD_API_PTHREAD 346c7e4239fSAsiri Rathnayake 347c7e4239fSAsiri Rathnayake_LIBCPP_END_NAMESPACE_STD 348c7e4239fSAsiri Rathnayake 3493cf2f7bcSAsiri Rathnayake#endif // !_LIBCPP_HAS_THREAD_API_EXTERNAL || !__libcpp_has_include(<__external_threading>) 35081c0be3fSAsiri Rathnayake 351c7e4239fSAsiri Rathnayake#endif // _LIBCPP_HAS_NO_THREADS 352c7e4239fSAsiri Rathnayake 353c7e4239fSAsiri Rathnayake#endif // _LIBCPP_THREADING_SUPPORT 354