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