xref: /llvm-project/libcxx/include/__cxx03/__thread/support/windows.h (revision ce7771902dc50d900de639d499a60486b83f70e0)
1e78f53d1SNikolas Klauser // -*- C++ -*-
2e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
3e78f53d1SNikolas Klauser //
4e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
6e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7e78f53d1SNikolas Klauser //
8e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
9e78f53d1SNikolas Klauser 
10*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03___THREAD_SUPPORT_WINDOWS_H
11*ce777190SNikolas Klauser #define _LIBCPP___CXX03___THREAD_SUPPORT_WINDOWS_H
12e78f53d1SNikolas Klauser 
1373fbae83SNikolas Klauser #include <__cxx03/__chrono/duration.h>
1473fbae83SNikolas Klauser #include <__cxx03/__config>
1573fbae83SNikolas Klauser #include <__cxx03/ctime>
16e78f53d1SNikolas Klauser 
17e78f53d1SNikolas Klauser #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
18e78f53d1SNikolas Klauser #  pragma GCC system_header
19e78f53d1SNikolas Klauser #endif
20e78f53d1SNikolas Klauser 
21e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
22e78f53d1SNikolas Klauser 
23e78f53d1SNikolas Klauser using __libcpp_timespec_t = ::timespec;
24e78f53d1SNikolas Klauser 
25e78f53d1SNikolas Klauser //
26e78f53d1SNikolas Klauser // Mutex
27e78f53d1SNikolas Klauser //
28e78f53d1SNikolas Klauser typedef void* __libcpp_mutex_t;
29e78f53d1SNikolas Klauser #define _LIBCPP_MUTEX_INITIALIZER 0
30e78f53d1SNikolas Klauser 
31e78f53d1SNikolas Klauser #if defined(_M_IX86) || defined(__i386__) || defined(_M_ARM) || defined(__arm__)
32e78f53d1SNikolas Klauser typedef void* __libcpp_recursive_mutex_t[6];
33e78f53d1SNikolas Klauser #elif defined(_M_AMD64) || defined(__x86_64__) || defined(_M_ARM64) || defined(__aarch64__)
34e78f53d1SNikolas Klauser typedef void* __libcpp_recursive_mutex_t[5];
35e78f53d1SNikolas Klauser #else
36e78f53d1SNikolas Klauser #  error Unsupported architecture
37e78f53d1SNikolas Klauser #endif
38e78f53d1SNikolas Klauser 
39e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t* __m);
40e78f53d1SNikolas Klauser 
41e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int
42e78f53d1SNikolas Klauser __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t* __m);
43e78f53d1SNikolas Klauser 
44e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS bool
45e78f53d1SNikolas Klauser __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t* __m);
46e78f53d1SNikolas Klauser 
47e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int
48e78f53d1SNikolas Klauser __libcpp_recursive_mutex_unlock(__libcpp_recursive_mutex_t* __m);
49e78f53d1SNikolas Klauser 
50e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t* __m);
51e78f53d1SNikolas Klauser 
52e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_mutex_lock(__libcpp_mutex_t* __m);
53e78f53d1SNikolas Klauser 
54e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS bool __libcpp_mutex_trylock(__libcpp_mutex_t* __m);
55e78f53d1SNikolas Klauser 
56e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_mutex_unlock(__libcpp_mutex_t* __m);
57e78f53d1SNikolas Klauser 
58e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_mutex_destroy(__libcpp_mutex_t* __m);
59e78f53d1SNikolas Klauser 
60e78f53d1SNikolas Klauser //
61e78f53d1SNikolas Klauser // Condition variable
62e78f53d1SNikolas Klauser //
63e78f53d1SNikolas Klauser typedef void* __libcpp_condvar_t;
64e78f53d1SNikolas Klauser #define _LIBCPP_CONDVAR_INITIALIZER 0
65e78f53d1SNikolas Klauser 
66e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_condvar_signal(__libcpp_condvar_t* __cv);
67e78f53d1SNikolas Klauser 
68e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv);
69e78f53d1SNikolas Klauser 
70e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int
71e78f53d1SNikolas Klauser __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m);
72e78f53d1SNikolas Klauser 
73e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int
74e78f53d1SNikolas Klauser __libcpp_condvar_timedwait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m, __libcpp_timespec_t* __ts);
75e78f53d1SNikolas Klauser 
76e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv);
77e78f53d1SNikolas Klauser 
78e78f53d1SNikolas Klauser //
79e78f53d1SNikolas Klauser // Execute once
80e78f53d1SNikolas Klauser //
81e78f53d1SNikolas Klauser typedef void* __libcpp_exec_once_flag;
82e78f53d1SNikolas Klauser #define _LIBCPP_EXEC_ONCE_INITIALIZER 0
83e78f53d1SNikolas Klauser 
84e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_execute_once(__libcpp_exec_once_flag* __flag, void (*__init_routine)());
85e78f53d1SNikolas Klauser 
86e78f53d1SNikolas Klauser //
87e78f53d1SNikolas Klauser // Thread id
88e78f53d1SNikolas Klauser //
89e78f53d1SNikolas Klauser typedef long __libcpp_thread_id;
90e78f53d1SNikolas Klauser 
91e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI bool __libcpp_thread_id_equal(__libcpp_thread_id __t1, __libcpp_thread_id __t2);
92e78f53d1SNikolas Klauser 
93e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI bool __libcpp_thread_id_less(__libcpp_thread_id __t1, __libcpp_thread_id __t2);
94e78f53d1SNikolas Klauser 
95e78f53d1SNikolas Klauser //
96e78f53d1SNikolas Klauser // Thread
97e78f53d1SNikolas Klauser //
98e78f53d1SNikolas Klauser #define _LIBCPP_NULL_THREAD 0U
99e78f53d1SNikolas Klauser typedef void* __libcpp_thread_t;
100e78f53d1SNikolas Klauser 
101e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI bool __libcpp_thread_isnull(const __libcpp_thread_t* __t);
102e78f53d1SNikolas Klauser 
103e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_thread_create(__libcpp_thread_t* __t, void* (*__func)(void*), void* __arg);
104e78f53d1SNikolas Klauser 
105e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI __libcpp_thread_id __libcpp_thread_get_current_id();
106e78f53d1SNikolas Klauser 
107e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI __libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t* __t);
108e78f53d1SNikolas Klauser 
109e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_thread_join(__libcpp_thread_t* __t);
110e78f53d1SNikolas Klauser 
111e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_thread_detach(__libcpp_thread_t* __t);
112e78f53d1SNikolas Klauser 
113e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI void __libcpp_thread_yield();
114e78f53d1SNikolas Klauser 
115e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns);
116e78f53d1SNikolas Klauser 
117e78f53d1SNikolas Klauser //
118e78f53d1SNikolas Klauser // Thread local storage
119e78f53d1SNikolas Klauser //
120e78f53d1SNikolas Klauser typedef long __libcpp_tls_key;
121e78f53d1SNikolas Klauser 
122e78f53d1SNikolas Klauser #define _LIBCPP_TLS_DESTRUCTOR_CC __stdcall
123e78f53d1SNikolas Klauser 
124e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int
125e78f53d1SNikolas Klauser __libcpp_tls_create(__libcpp_tls_key* __key, void(_LIBCPP_TLS_DESTRUCTOR_CC* __at_exit)(void*));
126e78f53d1SNikolas Klauser 
127e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI void* __libcpp_tls_get(__libcpp_tls_key __key);
128e78f53d1SNikolas Klauser 
129e78f53d1SNikolas Klauser _LIBCPP_EXPORTED_FROM_ABI int __libcpp_tls_set(__libcpp_tls_key __key, void* __p);
130e78f53d1SNikolas Klauser 
131e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
132e78f53d1SNikolas Klauser 
133*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___THREAD_SUPPORT_WINDOWS_H
134