xref: /llvm-project/libcxx/include/__cxx03/__thread/support.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_H
11*ce777190SNikolas Klauser #define _LIBCPP___CXX03___THREAD_SUPPORT_H
12e78f53d1SNikolas Klauser 
1373fbae83SNikolas Klauser #include <__cxx03/__config>
14e78f53d1SNikolas Klauser 
15e78f53d1SNikolas Klauser #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
16e78f53d1SNikolas Klauser #  pragma GCC system_header
17e78f53d1SNikolas Klauser #endif
18e78f53d1SNikolas Klauser 
19e78f53d1SNikolas Klauser /*
20e78f53d1SNikolas Klauser 
21e78f53d1SNikolas Klauser //
22e78f53d1SNikolas Klauser // The library supports multiple implementations of the basic threading functionality.
23e78f53d1SNikolas Klauser // The following functionality must be provided by any implementation:
24e78f53d1SNikolas Klauser //
25e78f53d1SNikolas Klauser 
26e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
27e78f53d1SNikolas Klauser 
28e78f53d1SNikolas Klauser using __libcpp_timespec_t = ...;
29e78f53d1SNikolas Klauser 
30e78f53d1SNikolas Klauser //
31e78f53d1SNikolas Klauser // Mutex
32e78f53d1SNikolas Klauser //
33e78f53d1SNikolas Klauser using __libcpp_mutex_t = ...;
34e78f53d1SNikolas Klauser #define _LIBCPP_MUTEX_INITIALIZER ...
35e78f53d1SNikolas Klauser 
36e78f53d1SNikolas Klauser using __libcpp_recursive_mutex_t = ...;
37e78f53d1SNikolas Klauser 
38e78f53d1SNikolas Klauser int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t*);
39e78f53d1SNikolas Klauser _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t*);
40e78f53d1SNikolas Klauser _LIBCPP_NO_THREAD_SAFETY_ANALYSIS bool __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t*);
41e78f53d1SNikolas Klauser _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_recursive_mutex_unlock(__libcpp_recursive_mutex_t*);
42e78f53d1SNikolas Klauser int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t*);
43e78f53d1SNikolas Klauser 
44e78f53d1SNikolas Klauser _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_mutex_lock(__libcpp_mutex_t*);
45e78f53d1SNikolas Klauser _LIBCPP_NO_THREAD_SAFETY_ANALYSIS bool __libcpp_mutex_trylock(__libcpp_mutex_t*);
46e78f53d1SNikolas Klauser _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_mutex_unlock(__libcpp_mutex_t*);
47e78f53d1SNikolas Klauser int __libcpp_mutex_destroy(__libcpp_mutex_t*);
48e78f53d1SNikolas Klauser 
49e78f53d1SNikolas Klauser //
50e78f53d1SNikolas Klauser // Condition Variable
51e78f53d1SNikolas Klauser //
52e78f53d1SNikolas Klauser using __libcpp_condvar_t = ...;
53e78f53d1SNikolas Klauser #define _LIBCPP_CONDVAR_INITIALIZER ...
54e78f53d1SNikolas Klauser 
55e78f53d1SNikolas Klauser int __libcpp_condvar_signal(__libcpp_condvar_t*);
56e78f53d1SNikolas Klauser int __libcpp_condvar_broadcast(__libcpp_condvar_t*);
57e78f53d1SNikolas Klauser _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_condvar_wait(__libcpp_condvar_t*, __libcpp_mutex_t*);
58e78f53d1SNikolas Klauser _LIBCPP_NO_THREAD_SAFETY_ANALYSIS
59e78f53d1SNikolas Klauser int __libcpp_condvar_timedwait(__libcpp_condvar_t*, __libcpp_mutex_t*, __libcpp_timespec_t*);
60e78f53d1SNikolas Klauser int __libcpp_condvar_destroy(__libcpp_condvar_t*);
61e78f53d1SNikolas Klauser 
62e78f53d1SNikolas Klauser //
63e78f53d1SNikolas Klauser // Execute once
64e78f53d1SNikolas Klauser //
65e78f53d1SNikolas Klauser using __libcpp_exec_once_flag = ...;
66e78f53d1SNikolas Klauser #define _LIBCPP_EXEC_ONCE_INITIALIZER ...
67e78f53d1SNikolas Klauser 
68e78f53d1SNikolas Klauser int __libcpp_execute_once(__libcpp_exec_once_flag*, void (*__init_routine)());
69e78f53d1SNikolas Klauser 
70e78f53d1SNikolas Klauser //
71e78f53d1SNikolas Klauser // Thread id
72e78f53d1SNikolas Klauser //
73e78f53d1SNikolas Klauser using __libcpp_thread_id = ...;
74e78f53d1SNikolas Klauser 
75e78f53d1SNikolas Klauser bool __libcpp_thread_id_equal(__libcpp_thread_id, __libcpp_thread_id);
76e78f53d1SNikolas Klauser bool __libcpp_thread_id_less(__libcpp_thread_id, __libcpp_thread_id);
77e78f53d1SNikolas Klauser 
78e78f53d1SNikolas Klauser //
79e78f53d1SNikolas Klauser // Thread
80e78f53d1SNikolas Klauser //
81e78f53d1SNikolas Klauser #define _LIBCPP_NULL_THREAD ...
82e78f53d1SNikolas Klauser using __libcpp_thread_t = ...;
83e78f53d1SNikolas Klauser 
84e78f53d1SNikolas Klauser bool __libcpp_thread_isnull(const __libcpp_thread_t*);
85e78f53d1SNikolas Klauser int __libcpp_thread_create(__libcpp_thread_t*, void* (*__func)(void*), void* __arg);
86e78f53d1SNikolas Klauser __libcpp_thread_id __libcpp_thread_get_current_id();
87e78f53d1SNikolas Klauser __libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t*);
88e78f53d1SNikolas Klauser int __libcpp_thread_join(__libcpp_thread_t*);
89e78f53d1SNikolas Klauser int __libcpp_thread_detach(__libcpp_thread_t*);
90e78f53d1SNikolas Klauser void __libcpp_thread_yield();
91e78f53d1SNikolas Klauser void __libcpp_thread_sleep_for(const chrono::nanoseconds&);
92e78f53d1SNikolas Klauser 
93e78f53d1SNikolas Klauser //
94e78f53d1SNikolas Klauser // Thread local storage
95e78f53d1SNikolas Klauser //
96e78f53d1SNikolas Klauser #define _LIBCPP_TLS_DESTRUCTOR_CC ...
97e78f53d1SNikolas Klauser using __libcpp_tls_key = ...;
98e78f53d1SNikolas Klauser 
99e78f53d1SNikolas Klauser int __libcpp_tls_create(__libcpp_tls_key*, void (*__at_exit)(void*));
100e78f53d1SNikolas Klauser void* __libcpp_tls_get(__libcpp_tls_key);
101e78f53d1SNikolas Klauser int __libcpp_tls_set(__libcpp_tls_key, void*);
102e78f53d1SNikolas Klauser 
103e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
104e78f53d1SNikolas Klauser 
105e78f53d1SNikolas Klauser */
106e78f53d1SNikolas Klauser 
107e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_THREADS)
108e78f53d1SNikolas Klauser 
109e78f53d1SNikolas Klauser #  if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
11073fbae83SNikolas Klauser #    include <__cxx03/__thread/support/external.h>
111e78f53d1SNikolas Klauser #  elif defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
11273fbae83SNikolas Klauser #    include <__cxx03/__thread/support/pthread.h>
113e78f53d1SNikolas Klauser #  elif defined(_LIBCPP_HAS_THREAD_API_C11)
11473fbae83SNikolas Klauser #    include <__cxx03/__thread/support/c11.h>
115e78f53d1SNikolas Klauser #  elif defined(_LIBCPP_HAS_THREAD_API_WIN32)
11673fbae83SNikolas Klauser #    include <__cxx03/__thread/support/windows.h>
117e78f53d1SNikolas Klauser #  else
118e78f53d1SNikolas Klauser #    error "No threading API was selected"
119e78f53d1SNikolas Klauser #  endif
120e78f53d1SNikolas Klauser 
121e78f53d1SNikolas Klauser #endif // !_LIBCPP_HAS_NO_THREADS
122e78f53d1SNikolas Klauser 
123*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___THREAD_SUPPORT_H
124