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 66790e10f6SSaleem Abdulrasool// Condition Variable 67790e10f6SSaleem Abdulrasooltypedef pthread_cond_t __libcpp_condvar_t; 68790e10f6SSaleem Abdulrasool#define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER 69790e10f6SSaleem Abdulrasool 70*205d7d3fSAsiri Rathnayake// Execute once 71*205d7d3fSAsiri Rathnayaketypedef pthread_once_t __libcpp_exec_once_flag; 72*205d7d3fSAsiri Rathnayake#define _LIBCPP_EXEC_ONCE_INITIALIZER PTHREAD_ONCE_INIT 73*205d7d3fSAsiri Rathnayake 74*205d7d3fSAsiri Rathnayake// Thread id 75790e10f6SSaleem Abdulrasooltypedef pthread_t __libcpp_thread_id; 76790e10f6SSaleem Abdulrasool 77790e10f6SSaleem Abdulrasool// Thread 78790e10f6SSaleem Abdulrasooltypedef pthread_t __libcpp_thread_t; 79790e10f6SSaleem Abdulrasool 80790e10f6SSaleem Abdulrasool// Thrad Local Storage 81790e10f6SSaleem Abdulrasooltypedef pthread_key_t __libcpp_tls_key; 82790e10f6SSaleem Abdulrasool#endif 83790e10f6SSaleem Abdulrasool 84790e10f6SSaleem Abdulrasool// Mutex 858c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 868c2bf45dSAsiri Rathnayakeint __libcpp_recursive_mutex_init(__libcpp_mutex_t *__m); 87790e10f6SSaleem Abdulrasool 888c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 898c2bf45dSAsiri Rathnayakeint __libcpp_mutex_lock(__libcpp_mutex_t *__m); 90790e10f6SSaleem Abdulrasool 918c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 928c2bf45dSAsiri Rathnayakeint __libcpp_mutex_trylock(__libcpp_mutex_t *__m); 93790e10f6SSaleem Abdulrasool 948c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 958c2bf45dSAsiri Rathnayakeint __libcpp_mutex_unlock(__libcpp_mutex_t *__m); 96790e10f6SSaleem Abdulrasool 978c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 988c2bf45dSAsiri Rathnayakeint __libcpp_mutex_destroy(__libcpp_mutex_t *__m); 998c2bf45dSAsiri Rathnayake 1008c2bf45dSAsiri Rathnayake// Condition variable 1018c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1028c2bf45dSAsiri Rathnayakeint __libcpp_condvar_signal(__libcpp_condvar_t* __cv); 103790e10f6SSaleem Abdulrasool 1048c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1058c2bf45dSAsiri Rathnayakeint __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv); 106790e10f6SSaleem Abdulrasool 1078c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1088c2bf45dSAsiri Rathnayakeint __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m); 109790e10f6SSaleem Abdulrasool 1108c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 111790e10f6SSaleem Abdulrasoolint __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m, 112790e10f6SSaleem Abdulrasool timespec *__ts); 113790e10f6SSaleem Abdulrasool 1148c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1158c2bf45dSAsiri Rathnayakeint __libcpp_condvar_destroy(__libcpp_condvar_t* __cv); 1168c2bf45dSAsiri Rathnayake 117*205d7d3fSAsiri Rathnayake// Execute once 118*205d7d3fSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 119*205d7d3fSAsiri Rathnayakeint __libcpp_execute_once(__libcpp_exec_once_flag *flag, 120*205d7d3fSAsiri Rathnayake void (*init_routine)(void)); 121*205d7d3fSAsiri Rathnayake 122*205d7d3fSAsiri Rathnayake// Thread id 123*205d7d3fSAsiri Rathnayake#if defined(__APPLE__) && !defined(__arm__) 124*205d7d3fSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 125*205d7d3fSAsiri Rathnayakemach_port_t __libcpp_thread_get_port(); 126*205d7d3fSAsiri Rathnayake#endif 127*205d7d3fSAsiri Rathnayake 1288c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1298c2bf45dSAsiri Rathnayakebool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2); 130790e10f6SSaleem Abdulrasool 1318c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1328c2bf45dSAsiri Rathnayakebool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2); 1338c2bf45dSAsiri Rathnayake 1348c2bf45dSAsiri Rathnayake// Thread 1358c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 136790e10f6SSaleem Abdulrasoolint __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *), 137790e10f6SSaleem Abdulrasool void *__arg); 138790e10f6SSaleem Abdulrasool 1398c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1408c2bf45dSAsiri Rathnayake__libcpp_thread_id __libcpp_thread_get_current_id(); 141790e10f6SSaleem Abdulrasool 1428c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1438c2bf45dSAsiri Rathnayake__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t); 144790e10f6SSaleem Abdulrasool 1458c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1468c2bf45dSAsiri Rathnayakeint __libcpp_thread_join(__libcpp_thread_t *__t); 147790e10f6SSaleem Abdulrasool 1488c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1498c2bf45dSAsiri Rathnayakeint __libcpp_thread_detach(__libcpp_thread_t *__t); 150790e10f6SSaleem Abdulrasool 1518c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1528c2bf45dSAsiri Rathnayakevoid __libcpp_thread_yield(); 1538c2bf45dSAsiri Rathnayake 1548c2bf45dSAsiri Rathnayake// Thread local storage 1558c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1568c2bf45dSAsiri Rathnayakeint __libcpp_tls_create(__libcpp_tls_key *__key, void (*__at_exit)(void *)); 157790e10f6SSaleem Abdulrasool 1588c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 1598c2bf45dSAsiri Rathnayakevoid *__libcpp_tls_get(__libcpp_tls_key __key); 160790e10f6SSaleem Abdulrasool 1618c2bf45dSAsiri Rathnayake_LIBCPP_THREAD_ABI_VISIBILITY 162*205d7d3fSAsiri Rathnayakeint __libcpp_tls_set(__libcpp_tls_key __key, void *__p); 1638c2bf45dSAsiri Rathnayake 1646cb0d41cSAsiri Rathnayake#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \ 1656cb0d41cSAsiri Rathnayake defined(_LIBCPP_BUILDING_THREAD_API_EXTERNAL_PTHREAD) 1668c2bf45dSAsiri Rathnayake 167c7e4239fSAsiri Rathnayakeint __libcpp_recursive_mutex_init(__libcpp_mutex_t *__m) 168c7e4239fSAsiri Rathnayake{ 169c7e4239fSAsiri Rathnayake pthread_mutexattr_t attr; 170c7e4239fSAsiri Rathnayake int __ec = pthread_mutexattr_init(&attr); 171c7e4239fSAsiri Rathnayake if (__ec) 172790e10f6SSaleem Abdulrasool return __ec; 173790e10f6SSaleem Abdulrasool __ec = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); 174790e10f6SSaleem Abdulrasool if (__ec) { 175c7e4239fSAsiri Rathnayake pthread_mutexattr_destroy(&attr); 176c7e4239fSAsiri Rathnayake return __ec; 177c7e4239fSAsiri Rathnayake } 178c7e4239fSAsiri Rathnayake __ec = pthread_mutex_init(__m, &attr); 179790e10f6SSaleem Abdulrasool if (__ec) { 180c7e4239fSAsiri Rathnayake pthread_mutexattr_destroy(&attr); 181c7e4239fSAsiri Rathnayake return __ec; 182c7e4239fSAsiri Rathnayake } 183c7e4239fSAsiri Rathnayake __ec = pthread_mutexattr_destroy(&attr); 184790e10f6SSaleem Abdulrasool if (__ec) { 185c7e4239fSAsiri Rathnayake pthread_mutex_destroy(__m); 186c7e4239fSAsiri Rathnayake return __ec; 187c7e4239fSAsiri Rathnayake } 188c7e4239fSAsiri Rathnayake return 0; 189c7e4239fSAsiri Rathnayake} 190c7e4239fSAsiri Rathnayake 191c7e4239fSAsiri Rathnayakeint __libcpp_mutex_lock(__libcpp_mutex_t *__m) 192c7e4239fSAsiri Rathnayake{ 193c7e4239fSAsiri Rathnayake return pthread_mutex_lock(__m); 194c7e4239fSAsiri Rathnayake} 195c7e4239fSAsiri Rathnayake 196c7e4239fSAsiri Rathnayakeint __libcpp_mutex_trylock(__libcpp_mutex_t *__m) 197c7e4239fSAsiri Rathnayake{ 198c7e4239fSAsiri Rathnayake return pthread_mutex_trylock(__m); 199c7e4239fSAsiri Rathnayake} 200c7e4239fSAsiri Rathnayake 201c7e4239fSAsiri Rathnayakeint __libcpp_mutex_unlock(__libcpp_mutex_t *__m) 202c7e4239fSAsiri Rathnayake{ 203c7e4239fSAsiri Rathnayake return pthread_mutex_unlock(__m); 204c7e4239fSAsiri Rathnayake} 205c7e4239fSAsiri Rathnayake 206c7e4239fSAsiri Rathnayakeint __libcpp_mutex_destroy(__libcpp_mutex_t *__m) 207c7e4239fSAsiri Rathnayake{ 208c7e4239fSAsiri Rathnayake return pthread_mutex_destroy(__m); 209c7e4239fSAsiri Rathnayake} 210c7e4239fSAsiri Rathnayake 211790e10f6SSaleem Abdulrasool// Condition Variable 212c7e4239fSAsiri Rathnayakeint __libcpp_condvar_signal(__libcpp_condvar_t *__cv) 213c7e4239fSAsiri Rathnayake{ 214c7e4239fSAsiri Rathnayake return pthread_cond_signal(__cv); 215c7e4239fSAsiri Rathnayake} 216c7e4239fSAsiri Rathnayake 217c7e4239fSAsiri Rathnayakeint __libcpp_condvar_broadcast(__libcpp_condvar_t *__cv) 218c7e4239fSAsiri Rathnayake{ 219c7e4239fSAsiri Rathnayake return pthread_cond_broadcast(__cv); 220c7e4239fSAsiri Rathnayake} 221c7e4239fSAsiri Rathnayake 222c7e4239fSAsiri Rathnayakeint __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m) 223c7e4239fSAsiri Rathnayake{ 224c7e4239fSAsiri Rathnayake return pthread_cond_wait(__cv, __m); 225c7e4239fSAsiri Rathnayake} 226c7e4239fSAsiri Rathnayake 227790e10f6SSaleem Abdulrasoolint __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m, 228790e10f6SSaleem Abdulrasool timespec *__ts) 229c7e4239fSAsiri Rathnayake{ 230c7e4239fSAsiri Rathnayake return pthread_cond_timedwait(__cv, __m, __ts); 231c7e4239fSAsiri Rathnayake} 232c7e4239fSAsiri Rathnayake 233c7e4239fSAsiri Rathnayakeint __libcpp_condvar_destroy(__libcpp_condvar_t *__cv) 234c7e4239fSAsiri Rathnayake{ 235c7e4239fSAsiri Rathnayake return pthread_cond_destroy(__cv); 236c7e4239fSAsiri Rathnayake} 237c7e4239fSAsiri Rathnayake 238*205d7d3fSAsiri Rathnayake// Execute once 239*205d7d3fSAsiri Rathnayakeint __libcpp_execute_once(__libcpp_exec_once_flag *flag, 240*205d7d3fSAsiri Rathnayake void (*init_routine)(void)) { 241*205d7d3fSAsiri Rathnayake return pthread_once(flag, init_routine); 242*205d7d3fSAsiri Rathnayake} 243*205d7d3fSAsiri Rathnayake 244*205d7d3fSAsiri Rathnayake// Thread id 245*205d7d3fSAsiri Rathnayake#if defined(__APPLE__) && !defined(__arm__) 246*205d7d3fSAsiri Rathnayakemach_port_t __libcpp_thread_get_port() { 247*205d7d3fSAsiri Rathnayake return pthread_mach_thread_np(pthread_self()); 248*205d7d3fSAsiri Rathnayake} 249*205d7d3fSAsiri Rathnayake#endif 250*205d7d3fSAsiri Rathnayake 251c7e4239fSAsiri Rathnayake// Returns non-zero if the thread ids are equal, otherwise 0 252c7e4239fSAsiri Rathnayakebool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2) 253c7e4239fSAsiri Rathnayake{ 254c7e4239fSAsiri Rathnayake return pthread_equal(t1, t2) != 0; 255c7e4239fSAsiri Rathnayake} 256c7e4239fSAsiri Rathnayake 257c7e4239fSAsiri Rathnayake// Returns non-zero if t1 < t2, otherwise 0 258c7e4239fSAsiri Rathnayakebool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2) 259c7e4239fSAsiri Rathnayake{ 260c7e4239fSAsiri Rathnayake return t1 < t2; 261c7e4239fSAsiri Rathnayake} 262c7e4239fSAsiri Rathnayake 263c7e4239fSAsiri Rathnayake// Thread 264790e10f6SSaleem Abdulrasoolint __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *), 265790e10f6SSaleem Abdulrasool void *__arg) 266c7e4239fSAsiri Rathnayake{ 267c7e4239fSAsiri Rathnayake return pthread_create(__t, 0, __func, __arg); 268c7e4239fSAsiri Rathnayake} 269c7e4239fSAsiri Rathnayake 270c7e4239fSAsiri Rathnayake__libcpp_thread_id __libcpp_thread_get_current_id() 271c7e4239fSAsiri Rathnayake{ 272c7e4239fSAsiri Rathnayake return pthread_self(); 273c7e4239fSAsiri Rathnayake} 274c7e4239fSAsiri Rathnayake 275c7e4239fSAsiri Rathnayake__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t) 276c7e4239fSAsiri Rathnayake{ 277c7e4239fSAsiri Rathnayake return *__t; 278c7e4239fSAsiri Rathnayake} 279c7e4239fSAsiri Rathnayake 280c7e4239fSAsiri Rathnayakeint __libcpp_thread_join(__libcpp_thread_t *__t) 281c7e4239fSAsiri Rathnayake{ 282c7e4239fSAsiri Rathnayake return pthread_join(*__t, 0); 283c7e4239fSAsiri Rathnayake} 284c7e4239fSAsiri Rathnayake 285c7e4239fSAsiri Rathnayakeint __libcpp_thread_detach(__libcpp_thread_t *__t) 286c7e4239fSAsiri Rathnayake{ 287c7e4239fSAsiri Rathnayake return pthread_detach(*__t); 288c7e4239fSAsiri Rathnayake} 289c7e4239fSAsiri Rathnayake 290c7e4239fSAsiri Rathnayakevoid __libcpp_thread_yield() 291c7e4239fSAsiri Rathnayake{ 292c7e4239fSAsiri Rathnayake sched_yield(); 293c7e4239fSAsiri Rathnayake} 294c7e4239fSAsiri Rathnayake 295c7e4239fSAsiri Rathnayake// Thread local storage 2968c2bf45dSAsiri Rathnayakeint __libcpp_tls_create(__libcpp_tls_key *__key, void (*__at_exit)(void *)) 297c7e4239fSAsiri Rathnayake{ 298c7e4239fSAsiri Rathnayake return pthread_key_create(__key, __at_exit); 299c7e4239fSAsiri Rathnayake} 300c7e4239fSAsiri Rathnayake 3018c2bf45dSAsiri Rathnayakevoid *__libcpp_tls_get(__libcpp_tls_key __key) 302c7e4239fSAsiri Rathnayake{ 303c7e4239fSAsiri Rathnayake return pthread_getspecific(__key); 304c7e4239fSAsiri Rathnayake} 305c7e4239fSAsiri Rathnayake 306*205d7d3fSAsiri Rathnayakeint __libcpp_tls_set(__libcpp_tls_key __key, void *__p) 307c7e4239fSAsiri Rathnayake{ 308*205d7d3fSAsiri Rathnayake return pthread_setspecific(__key, __p); 309c7e4239fSAsiri Rathnayake} 310c7e4239fSAsiri Rathnayake 311790e10f6SSaleem Abdulrasool#endif // _LIBCPP_HAS_THREAD_API_PTHREAD 312c7e4239fSAsiri Rathnayake 313c7e4239fSAsiri Rathnayake_LIBCPP_END_NAMESPACE_STD 314c7e4239fSAsiri Rathnayake 3153cf2f7bcSAsiri Rathnayake#endif // !_LIBCPP_HAS_THREAD_API_EXTERNAL || !__libcpp_has_include(<__external_threading>) 31681c0be3fSAsiri Rathnayake 317c7e4239fSAsiri Rathnayake#endif // _LIBCPP_HAS_NO_THREADS 318c7e4239fSAsiri Rathnayake 319c7e4239fSAsiri Rathnayake#endif // _LIBCPP_THREADING_SUPPORT 320