33 #ifndef _GLIBCXX_STDATOMIC_H
34 #define _GLIBCXX_STDATOMIC_H 1
36 _GLIBCXX_BEGIN_NAMESPACE(std)
37 _GLIBCXX_BEGIN_EXTERN_C
58 typedef struct __atomic_flag_base
63 #define ATOMIC_FLAG_INIT { false }
66 #if defined(_GLIBCXX_ATOMIC_BUILTINS_1) && defined(_GLIBCXX_ATOMIC_BUILTINS_2) \
67 && defined(_GLIBCXX_ATOMIC_BUILTINS_4) && defined(_GLIBCXX_ATOMIC_BUILTINS_8)
68 # define _GLIBCXX_ATOMIC_PROPERTY 2
69 # define _GLIBCXX_ATOMIC_NAMESPACE __atomic2
70 #elif defined(_GLIBCXX_ATOMIC_BUILTINS_1)
71 # define _GLIBCXX_ATOMIC_PROPERTY 1
72 # define _GLIBCXX_ATOMIC_NAMESPACE __atomic1
74 # define _GLIBCXX_ATOMIC_PROPERTY 0
75 # define _GLIBCXX_ATOMIC_NAMESPACE __atomic0
78 #define ATOMIC_INTEGRAL_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
79 #define ATOMIC_ADDRESS_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
86 inline namespace _GLIBCXX_ATOMIC_NAMESPACE { }
93 typedef atomic_schar atomic_int_least8_t;
94 typedef atomic_uchar atomic_uint_least8_t;
95 typedef atomic_short atomic_int_least16_t;
96 typedef atomic_ushort atomic_uint_least16_t;
97 typedef atomic_int atomic_int_least32_t;
98 typedef atomic_uint atomic_uint_least32_t;
99 typedef atomic_llong atomic_int_least64_t;
100 typedef atomic_ullong atomic_uint_least64_t;
102 typedef atomic_schar atomic_int_fast8_t;
103 typedef atomic_uchar atomic_uint_fast8_t;
104 typedef atomic_short atomic_int_fast16_t;
105 typedef atomic_ushort atomic_uint_fast16_t;
106 typedef atomic_int atomic_int_fast32_t;
107 typedef atomic_uint atomic_uint_fast32_t;
108 typedef atomic_llong atomic_int_fast64_t;
109 typedef atomic_ullong atomic_uint_fast64_t;
111 typedef atomic_long atomic_intptr_t;
112 typedef atomic_ulong atomic_uintptr_t;
114 typedef atomic_long atomic_ssize_t;
115 typedef atomic_ulong atomic_size_t;
117 typedef atomic_llong atomic_intmax_t;
118 typedef atomic_ullong atomic_uintmax_t;
120 typedef atomic_long atomic_ptrdiff_t;
124 atomic_flag_test_and_set_explicit(
volatile __atomic_flag_base*,
memory_order);
127 atomic_flag_test_and_set(
volatile __atomic_flag_base* __a)
128 {
return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); }
131 atomic_flag_clear_explicit(
volatile __atomic_flag_base*,
memory_order);
134 atomic_flag_clear(
volatile __atomic_flag_base* __a)
135 { atomic_flag_clear_explicit(__a, memory_order_seq_cst); }
138 __atomic_flag_wait_explicit(
volatile __atomic_flag_base*,
memory_order);
140 volatile __atomic_flag_base*
141 __atomic_flag_for_address(
const volatile void* __z) __attribute__((
const));
144 #define _ATOMIC_LOAD_(__a, __x) \
145 ({ volatile __typeof__ _ATOMIC_MEMBER_* __p = &_ATOMIC_MEMBER_; \
146 volatile atomic_flag* __g = __atomic_flag_for_address(__p); \
147 __atomic_flag_wait_explicit(__g, __x); \
148 __typeof__ _ATOMIC_MEMBER_ __r = *__p; \
149 atomic_flag_clear_explicit(__g, __x); \
152 #define _ATOMIC_STORE_(__a, __m, __x) \
153 ({ volatile __typeof__ _ATOMIC_MEMBER_* __p = &_ATOMIC_MEMBER_; \
154 __typeof__(__m) __v = (__m); \
155 volatile atomic_flag* __g = __atomic_flag_for_address(__p); \
156 __atomic_flag_wait_explicit(__g, __x); \
158 atomic_flag_clear_explicit(__g, __x); \
161 #define _ATOMIC_MODIFY_(__a, __o, __m, __x) \
162 ({ volatile __typeof__ _ATOMIC_MEMBER_* __p = &_ATOMIC_MEMBER_; \
163 __typeof__(__m) __v = (__m); \
164 volatile atomic_flag* __g = __atomic_flag_for_address(__p); \
165 __atomic_flag_wait_explicit(__g, __x); \
166 __typeof__ _ATOMIC_MEMBER_ __r = *__p; \
168 atomic_flag_clear_explicit(__g, __x); \
171 #define _ATOMIC_CMPEXCHNG_(__a, __e, __m, __x) \
172 ({ volatile __typeof__ _ATOMIC_MEMBER_* __p = &_ATOMIC_MEMBER_; \
173 __typeof__(__e) __q = (__e); \
174 __typeof__(__m) __v = (__m); \
176 volatile atomic_flag* __g = __atomic_flag_for_address(__p); \
177 __atomic_flag_wait_explicit(__g, __x); \
178 __typeof__ _ATOMIC_MEMBER_ __t__ = *__p; \
179 if (__t__ == *__q) { *__p = __v; __r = true; } \
180 else { *__q = __t__; __r = false; } \
181 atomic_flag_clear_explicit(__g, __x); \
186 _GLIBCXX_END_EXTERN_C
187 _GLIBCXX_END_NAMESPACE
195 using std::memory_order_relaxed;
196 using std::memory_order_consume;
197 using std::memory_order_acquire;
198 using std::memory_order_release;
199 using std::memory_order_acq_rel;
200 using std::memory_order_seq_cst;
201 using std::atomic_flag;
202 using std::atomic_bool;
217 using std::atomic_address;
__atomic_base< signed char > atomic_schar
atomic_schar
__atomic_base< unsigned int > atomic_uint
atomic_uint
__atomic_base< int > atomic_int
atomic_int
__atomic_base< unsigned long long > atomic_ullong
atomic_ullong
atomic 29.4.3, Generic atomic type, primary class template.
__atomic_base< unsigned char > atomic_uchar
atomic_uchar
enum std::memory_order memory_order
Enumeration for memory_order.
__atomic_base< unsigned long > atomic_ulong
atomic_ulong
__atomic_base< unsigned short > atomic_ushort
atomic_ushort
__atomic_base< wchar_t > atomic_wchar_t
atomic_wchar_t
__atomic_base< short > atomic_short
atomic_short
__atomic_base< char16_t > atomic_char16_t
atomic_char16_t
__atomic_base< long long > atomic_llong
atomic_llong
__atomic_base< char32_t > atomic_char32_t
atomic_char32_t
__atomic_base< long > atomic_long
atomic_long
__atomic_base< char > atomic_char
atomic_char
memory_order
Enumeration for memory_order.