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