blob: c20123d569c40260d4801e270ec17a03befefa61 [file] [log] [blame]
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +00001// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
4// The LLVM Compiler Infrastructure
5//
6// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_THREADING_SUPPORT
12#define _LIBCPP_THREADING_SUPPORT
13
14#include <__config>
Asiri Rathnayake1b939612017-02-09 09:31:41 +000015#include <chrono>
16#include <errno.h>
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +000017
18#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
19#pragma GCC system_header
20#endif
21
Asiri Rathnayake040945b2016-09-11 21:46:40 +000022#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
Eric Fiselier66134e82017-01-06 20:05:40 +000023# include <__external_threading>
24#elif !defined(_LIBCPP_HAS_NO_THREADS)
25
26#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
27# include <pthread.h>
28# include <sched.h>
29#endif
30
Eric Fiselier018a3d52017-05-31 22:07:49 +000031_LIBCPP_PUSH_MACROS
32#include <__undef_macros>
33
Dimitry Andric362353a2017-01-26 18:37:18 +000034#if defined(__FreeBSD__) && defined(__clang__) && __has_attribute(no_thread_safety_analysis)
35#define _LIBCPP_NO_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis))
36#else
37#define _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
38#endif
39
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +000040_LIBCPP_BEGIN_NAMESPACE_STD
41
Peter Collingbourne59f23892018-01-23 01:59:43 +000042#if defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \
43 defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL)
44
45#define _LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_FUNC_VIS
46
47#elif defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
48
49#define _LIBCPP_THREAD_ABI_VISIBILITY inline _LIBCPP_INLINE_VISIBILITY
50
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +000051// Mutex
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +000052typedef pthread_mutex_t __libcpp_mutex_t;
Asiri Rathnayake040945b2016-09-11 21:46:40 +000053#define _LIBCPP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +000054
Saleem Abdulrasool3451a652017-01-05 17:54:45 +000055typedef pthread_mutex_t __libcpp_recursive_mutex_t;
56
Saleem Abdulrasool1d192372017-01-03 02:00:31 +000057// Condition Variable
Asiri Rathnayake040945b2016-09-11 21:46:40 +000058typedef pthread_cond_t __libcpp_condvar_t;
59#define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER
Saleem Abdulrasool1d192372017-01-03 02:00:31 +000060
Asiri Rathnayakee262e7b2017-01-03 12:59:50 +000061// Execute once
62typedef pthread_once_t __libcpp_exec_once_flag;
63#define _LIBCPP_EXEC_ONCE_INITIALIZER PTHREAD_ONCE_INIT
64
65// Thread id
Saleem Abdulrasool1d192372017-01-03 02:00:31 +000066typedef pthread_t __libcpp_thread_id;
67
68// Thread
Asiri Rathnayakea1d7d2f2017-01-16 12:19:54 +000069#define _LIBCPP_NULL_THREAD 0U
70
Saleem Abdulrasool1d192372017-01-03 02:00:31 +000071typedef pthread_t __libcpp_thread_t;
72
73// Thrad Local Storage
74typedef pthread_key_t __libcpp_tls_key;
Saleem Abdulrasool678eadd2017-01-07 03:07:45 +000075
76#define _LIBCPP_TLS_DESTRUCTOR_CC
77#else
Saleem Abdulrasool678eadd2017-01-07 03:07:45 +000078
Peter Collingbourne59f23892018-01-23 01:59:43 +000079#define _LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_FUNC_VIS
80
81// Mutex
82typedef void* __libcpp_mutex_t;
83#define _LIBCPP_MUTEX_INITIALIZER 0
84
85#if defined(_M_IX86) || defined(__i386__) || defined(_M_ARM) || defined(__arm__)
86typedef void* __libcpp_recursive_mutex_t[6];
87#elif defined(_M_AMD64) || defined(__x86_64__) || defined(_M_ARM64) || defined(__aarch64__)
88typedef void* __libcpp_recursive_mutex_t[5];
89#else
90# error Unsupported architecture
91#endif
Saleem Abdulrasool678eadd2017-01-07 03:07:45 +000092
93// Condition Variable
Peter Collingbourne59f23892018-01-23 01:59:43 +000094typedef void* __libcpp_condvar_t;
95#define _LIBCPP_CONDVAR_INITIALIZER 0
Saleem Abdulrasool678eadd2017-01-07 03:07:45 +000096
97// Execute Once
Peter Collingbourne59f23892018-01-23 01:59:43 +000098typedef void* __libcpp_exec_once_flag;
99#define _LIBCPP_EXEC_ONCE_INITIALIZER 0
Saleem Abdulrasool678eadd2017-01-07 03:07:45 +0000100
101// Thread ID
Peter Collingbourne59f23892018-01-23 01:59:43 +0000102typedef long __libcpp_thread_id;
Saleem Abdulrasool678eadd2017-01-07 03:07:45 +0000103
104// Thread
Asiri Rathnayakea1d7d2f2017-01-16 12:19:54 +0000105#define _LIBCPP_NULL_THREAD 0U
106
Peter Collingbourne59f23892018-01-23 01:59:43 +0000107typedef void* __libcpp_thread_t;
Saleem Abdulrasool678eadd2017-01-07 03:07:45 +0000108
109// Thread Local Storage
Peter Collingbourne59f23892018-01-23 01:59:43 +0000110typedef long __libcpp_tls_key;
Saleem Abdulrasool678eadd2017-01-07 03:07:45 +0000111
Peter Collingbourne59f23892018-01-23 01:59:43 +0000112#define _LIBCPP_TLS_DESTRUCTOR_CC __stdcall
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000113#endif
114
115// Mutex
116_LIBCPP_THREAD_ABI_VISIBILITY
Saleem Abdulrasool3451a652017-01-05 17:54:45 +0000117int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m);
118
Dimitry Andric362353a2017-01-26 18:37:18 +0000119_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
Saleem Abdulrasool3451a652017-01-05 17:54:45 +0000120int __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t *__m);
121
Dimitry Andric362353a2017-01-26 18:37:18 +0000122_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
Eric Fiselier30d12e32017-01-14 10:27:12 +0000123bool __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t *__m);
Saleem Abdulrasool3451a652017-01-05 17:54:45 +0000124
Dimitry Andric362353a2017-01-26 18:37:18 +0000125_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
Saleem Abdulrasool3451a652017-01-05 17:54:45 +0000126int __libcpp_recursive_mutex_unlock(__libcpp_recursive_mutex_t *__m);
127
128_LIBCPP_THREAD_ABI_VISIBILITY
129int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t *__m);
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000130
Dimitry Andric362353a2017-01-26 18:37:18 +0000131_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000132int __libcpp_mutex_lock(__libcpp_mutex_t *__m);
133
Dimitry Andric362353a2017-01-26 18:37:18 +0000134_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
Eric Fiselier30d12e32017-01-14 10:27:12 +0000135bool __libcpp_mutex_trylock(__libcpp_mutex_t *__m);
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000136
Dimitry Andric362353a2017-01-26 18:37:18 +0000137_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000138int __libcpp_mutex_unlock(__libcpp_mutex_t *__m);
139
140_LIBCPP_THREAD_ABI_VISIBILITY
141int __libcpp_mutex_destroy(__libcpp_mutex_t *__m);
142
143// Condition variable
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000144_LIBCPP_THREAD_ABI_VISIBILITY
145int __libcpp_condvar_signal(__libcpp_condvar_t* __cv);
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000146
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000147_LIBCPP_THREAD_ABI_VISIBILITY
148int __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv);
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000149
Dimitry Andric362353a2017-01-26 18:37:18 +0000150_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000151int __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m);
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000152
Dimitry Andric362353a2017-01-26 18:37:18 +0000153_LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000154int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m,
155 timespec *__ts);
156
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000157_LIBCPP_THREAD_ABI_VISIBILITY
158int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv);
159
Asiri Rathnayakee262e7b2017-01-03 12:59:50 +0000160// Execute once
161_LIBCPP_THREAD_ABI_VISIBILITY
162int __libcpp_execute_once(__libcpp_exec_once_flag *flag,
163 void (*init_routine)(void));
164
165// Thread id
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000166_LIBCPP_THREAD_ABI_VISIBILITY
167bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2);
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000168
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000169_LIBCPP_THREAD_ABI_VISIBILITY
170bool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2);
171
172// Thread
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000173_LIBCPP_THREAD_ABI_VISIBILITY
Asiri Rathnayakea1d7d2f2017-01-16 12:19:54 +0000174bool __libcpp_thread_isnull(const __libcpp_thread_t *__t);
175
176_LIBCPP_THREAD_ABI_VISIBILITY
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000177int __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *),
178 void *__arg);
179
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000180_LIBCPP_THREAD_ABI_VISIBILITY
181__libcpp_thread_id __libcpp_thread_get_current_id();
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000182
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000183_LIBCPP_THREAD_ABI_VISIBILITY
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000184__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t);
185
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000186_LIBCPP_THREAD_ABI_VISIBILITY
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000187int __libcpp_thread_join(__libcpp_thread_t *__t);
188
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000189_LIBCPP_THREAD_ABI_VISIBILITY
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000190int __libcpp_thread_detach(__libcpp_thread_t *__t);
191
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000192_LIBCPP_THREAD_ABI_VISIBILITY
193void __libcpp_thread_yield();
194
Asiri Rathnayake1b939612017-02-09 09:31:41 +0000195_LIBCPP_THREAD_ABI_VISIBILITY
Joerg Sonnenberger5a0c9c32017-02-09 14:12:29 +0000196void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns);
Asiri Rathnayake1b939612017-02-09 09:31:41 +0000197
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000198// Thread local storage
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000199_LIBCPP_THREAD_ABI_VISIBILITY
Saleem Abdulrasool678eadd2017-01-07 03:07:45 +0000200int __libcpp_tls_create(__libcpp_tls_key* __key,
201 void(_LIBCPP_TLS_DESTRUCTOR_CC* __at_exit)(void*));
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000202
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000203_LIBCPP_THREAD_ABI_VISIBILITY
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000204void *__libcpp_tls_get(__libcpp_tls_key __key);
205
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000206_LIBCPP_THREAD_ABI_VISIBILITY
Asiri Rathnayakee262e7b2017-01-03 12:59:50 +0000207int __libcpp_tls_set(__libcpp_tls_key __key, void *__p);
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000208
Peter Collingbourne59f23892018-01-23 01:59:43 +0000209#if (!defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \
210 defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL)) && \
211 defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
Asiri Rathnayake040945b2016-09-11 21:46:40 +0000212
Saleem Abdulrasool3451a652017-01-05 17:54:45 +0000213int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000214{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000215 pthread_mutexattr_t attr;
216 int __ec = pthread_mutexattr_init(&attr);
217 if (__ec)
218 return __ec;
219 __ec = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
220 if (__ec) {
221 pthread_mutexattr_destroy(&attr);
222 return __ec;
223 }
224 __ec = pthread_mutex_init(__m, &attr);
225 if (__ec) {
226 pthread_mutexattr_destroy(&attr);
227 return __ec;
228 }
229 __ec = pthread_mutexattr_destroy(&attr);
230 if (__ec) {
231 pthread_mutex_destroy(__m);
232 return __ec;
233 }
234 return 0;
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000235}
236
Saleem Abdulrasool3451a652017-01-05 17:54:45 +0000237int __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t *__m)
238{
239 return pthread_mutex_lock(__m);
240}
241
Eric Fiselier30d12e32017-01-14 10:27:12 +0000242bool __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t *__m)
Saleem Abdulrasool3451a652017-01-05 17:54:45 +0000243{
Eric Fiselier30d12e32017-01-14 10:27:12 +0000244 return pthread_mutex_trylock(__m) == 0;
Saleem Abdulrasool3451a652017-01-05 17:54:45 +0000245}
246
247int __libcpp_recursive_mutex_unlock(__libcpp_mutex_t *__m)
248{
249 return pthread_mutex_unlock(__m);
250}
251
252int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t *__m)
253{
254 return pthread_mutex_destroy(__m);
255}
256
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000257int __libcpp_mutex_lock(__libcpp_mutex_t *__m)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000258{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000259 return pthread_mutex_lock(__m);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000260}
261
Eric Fiselier30d12e32017-01-14 10:27:12 +0000262bool __libcpp_mutex_trylock(__libcpp_mutex_t *__m)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000263{
Eric Fiselier30d12e32017-01-14 10:27:12 +0000264 return pthread_mutex_trylock(__m) == 0;
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000265}
266
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000267int __libcpp_mutex_unlock(__libcpp_mutex_t *__m)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000268{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000269 return pthread_mutex_unlock(__m);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000270}
271
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000272int __libcpp_mutex_destroy(__libcpp_mutex_t *__m)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000273{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000274 return pthread_mutex_destroy(__m);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000275}
276
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000277// Condition Variable
278int __libcpp_condvar_signal(__libcpp_condvar_t *__cv)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000279{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000280 return pthread_cond_signal(__cv);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000281}
282
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000283int __libcpp_condvar_broadcast(__libcpp_condvar_t *__cv)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000284{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000285 return pthread_cond_broadcast(__cv);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000286}
287
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000288int __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000289{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000290 return pthread_cond_wait(__cv, __m);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000291}
292
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000293int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m,
294 timespec *__ts)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000295{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000296 return pthread_cond_timedwait(__cv, __m, __ts);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000297}
298
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000299int __libcpp_condvar_destroy(__libcpp_condvar_t *__cv)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000300{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000301 return pthread_cond_destroy(__cv);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000302}
303
Asiri Rathnayakee262e7b2017-01-03 12:59:50 +0000304// Execute once
305int __libcpp_execute_once(__libcpp_exec_once_flag *flag,
306 void (*init_routine)(void)) {
307 return pthread_once(flag, init_routine);
308}
309
310// Thread id
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000311// Returns non-zero if the thread ids are equal, otherwise 0
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000312bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2)
313{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000314 return pthread_equal(t1, t2) != 0;
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000315}
316
317// Returns non-zero if t1 < t2, otherwise 0
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000318bool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2)
319{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000320 return t1 < t2;
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000321}
322
323// Thread
Asiri Rathnayakea1d7d2f2017-01-16 12:19:54 +0000324bool __libcpp_thread_isnull(const __libcpp_thread_t *__t) {
325 return *__t == 0;
326}
327
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000328int __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *),
329 void *__arg)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000330{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000331 return pthread_create(__t, 0, __func, __arg);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000332}
333
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000334__libcpp_thread_id __libcpp_thread_get_current_id()
335{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000336 return pthread_self();
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000337}
338
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000339__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000340{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000341 return *__t;
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000342}
343
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000344int __libcpp_thread_join(__libcpp_thread_t *__t)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000345{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000346 return pthread_join(*__t, 0);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000347}
348
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000349int __libcpp_thread_detach(__libcpp_thread_t *__t)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000350{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000351 return pthread_detach(*__t);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000352}
353
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000354void __libcpp_thread_yield()
355{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000356 sched_yield();
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000357}
358
Asiri Rathnayake1b939612017-02-09 09:31:41 +0000359void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns)
360{
361 using namespace chrono;
362 seconds __s = duration_cast<seconds>(__ns);
363 timespec __ts;
364 typedef decltype(__ts.tv_sec) ts_sec;
365 _LIBCPP_CONSTEXPR ts_sec __ts_sec_max = numeric_limits<ts_sec>::max();
366
367 if (__s.count() < __ts_sec_max)
368 {
369 __ts.tv_sec = static_cast<ts_sec>(__s.count());
370 __ts.tv_nsec = static_cast<decltype(__ts.tv_nsec)>((__ns - __s).count());
371 }
372 else
373 {
374 __ts.tv_sec = __ts_sec_max;
375 __ts.tv_nsec = 999999999; // (10^9 - 1)
376 }
377
378 while (nanosleep(&__ts, &__ts) == -1 && errno == EINTR);
379}
380
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000381// Thread local storage
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000382int __libcpp_tls_create(__libcpp_tls_key *__key, void (*__at_exit)(void *))
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000383{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000384 return pthread_key_create(__key, __at_exit);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000385}
386
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000387void *__libcpp_tls_get(__libcpp_tls_key __key)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000388{
Saleem Abdulrasool1d192372017-01-03 02:00:31 +0000389 return pthread_getspecific(__key);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000390}
391
Asiri Rathnayakee262e7b2017-01-03 12:59:50 +0000392int __libcpp_tls_set(__libcpp_tls_key __key, void *__p)
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000393{
Asiri Rathnayakee262e7b2017-01-03 12:59:50 +0000394 return pthread_setspecific(__key, __p);
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000395}
396
Eric Fiselier66134e82017-01-06 20:05:40 +0000397#endif // !_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL || _LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL
398
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000399_LIBCPP_END_NAMESPACE_STD
400
Eric Fiselier018a3d52017-05-31 22:07:49 +0000401_LIBCPP_POP_MACROS
402
Eric Fiselier66134e82017-01-06 20:05:40 +0000403#endif // !_LIBCPP_HAS_NO_THREADS
Asiri Rathnayake35ff03b2016-05-06 14:06:29 +0000404
405#endif // _LIBCPP_THREADING_SUPPORT