19
19
20
20
#include < __assert>
21
21
#include < __atomic/check_memory_order.h>
22
- #include < __atomic/cxx_atomic_impl.h>
23
- #include < __atomic/is_always_lock_free.h>
24
22
#include < __atomic/to_gcc_order.h>
25
23
#include < __config>
26
24
#include < __memory/addressof.h>
@@ -46,22 +44,22 @@ _LIBCPP_BEGIN_NAMESPACE_STD
46
44
47
45
template <class _Tp , bool = is_integral_v<_Tp> && !is_same_v<_Tp, bool >, bool = is_floating_point_v<_Tp>>
48
46
struct __atomic_ref_base {
49
- mutable __cxx_atomic_impl< _Tp&> __a_ ;
47
+ _Tp* __ptr_ ;
50
48
51
49
using value_type = _Tp;
52
50
53
51
static constexpr size_t required_alignment = alignof (_Tp);
54
52
55
- static constexpr bool is_always_lock_free = __libcpp_is_always_lock_free< _Tp>::__value ;
53
+ static constexpr bool is_always_lock_free = __atomic_always_lock_free( sizeof ( _Tp), 0 ) ;
56
54
57
- _LIBCPP_HIDE_FROM_ABI bool is_lock_free () const noexcept { return __cxx_atomic_is_lock_free (sizeof (_Tp)); }
55
+ _LIBCPP_HIDE_FROM_ABI bool is_lock_free () const noexcept { return __atomic_is_lock_free (sizeof (_Tp), 0 ); }
58
56
59
57
_LIBCPP_HIDE_FROM_ABI void store (_Tp __desired, memory_order __order = memory_order::seq_cst) const noexcept
60
58
_LIBCPP_CHECK_STORE_MEMORY_ORDER(__order) {
61
59
_LIBCPP_ASSERT_UNCATEGORIZED (
62
60
__order == memory_order::relaxed || __order == memory_order::release || __order == memory_order::seq_cst,
63
61
" memory order argument to atomic store operation is invalid" );
64
- __cxx_atomic_store (&__a_, __desired, __order);
62
+ __atomic_store (__ptr_, std::addressof ( __desired), __to_gcc_order ( __order) );
65
63
}
66
64
67
65
_LIBCPP_HIDE_FROM_ABI _Tp operator =(_Tp __desired) const noexcept {
@@ -75,13 +73,19 @@ struct __atomic_ref_base {
75
73
__order == memory_order::relaxed || __order == memory_order::consume || __order == memory_order::acquire ||
76
74
__order == memory_order::seq_cst,
77
75
" memory order argument to atomic load operation is invalid" );
78
- return __cxx_atomic_load (&__a_, __order);
76
+ alignas (_Tp) unsigned char __mem[sizeof (_Tp)];
77
+ auto * __ret = reinterpret_cast <_Tp*>(__mem);
78
+ __atomic_load (__ptr_, __ret, __to_gcc_order (__order));
79
+ return *__ret;
79
80
}
80
81
81
82
_LIBCPP_HIDE_FROM_ABI operator _Tp () const noexcept { return load (); }
82
83
83
84
_LIBCPP_HIDE_FROM_ABI _Tp exchange (_Tp __desired, memory_order __order = memory_order::seq_cst) const noexcept {
84
- return __cxx_atomic_exchange (&__a_, __desired, __order);
85
+ alignas (_Tp) unsigned char __mem[sizeof (_Tp)];
86
+ auto * __ret = reinterpret_cast <_Tp*>(__mem);
87
+ __atomic_exchange (__ptr_, std::addressof (__desired), __ret, __to_gcc_order (__order));
88
+ return *__ret;
85
89
}
86
90
_LIBCPP_HIDE_FROM_ABI bool
87
91
compare_exchange_weak (_Tp& __expected, _Tp __desired, memory_order __success, memory_order __failure) const noexcept
@@ -90,7 +94,13 @@ struct __atomic_ref_base {
90
94
__failure == memory_order::relaxed || __failure == memory_order::consume ||
91
95
__failure == memory_order::acquire || __failure == memory_order::seq_cst,
92
96
" failure memory order argument to weak atomic compare-and-exchange operation is invalid" );
93
- return __cxx_atomic_compare_exchange_weak (&__a_, &__expected, __desired, __success, __failure);
97
+ return __atomic_compare_exchange (
98
+ __ptr_,
99
+ std::addressof (__expected),
100
+ std::addressof (__desired),
101
+ true ,
102
+ __to_gcc_order (__success),
103
+ __to_gcc_order (__failure));
94
104
}
95
105
_LIBCPP_HIDE_FROM_ABI bool
96
106
compare_exchange_strong (_Tp& __expected, _Tp __desired, memory_order __success, memory_order __failure) const noexcept
@@ -99,16 +109,34 @@ struct __atomic_ref_base {
99
109
__failure == memory_order::relaxed || __failure == memory_order::consume ||
100
110
__failure == memory_order::acquire || __failure == memory_order::seq_cst,
101
111
" failure memory order argument to strong atomic compare-and-exchange operation is invalid" );
102
- return __cxx_atomic_compare_exchange_strong (&__a_, &__expected, __desired, __success, __failure);
112
+ return __atomic_compare_exchange (
113
+ __ptr_,
114
+ std::addressof (__expected),
115
+ std::addressof (__desired),
116
+ false ,
117
+ __to_gcc_order (__success),
118
+ __to_gcc_order (__failure));
103
119
}
104
120
105
121
_LIBCPP_HIDE_FROM_ABI bool
106
122
compare_exchange_weak (_Tp& __expected, _Tp __desired, memory_order __order = memory_order::seq_cst) const noexcept {
107
- return __cxx_atomic_compare_exchange_weak (&__a_, &__expected, __desired, __order, __order);
123
+ return __atomic_compare_exchange (
124
+ __ptr_,
125
+ std::addressof (__expected),
126
+ std::addressof (__desired),
127
+ true ,
128
+ __to_gcc_order (__order),
129
+ __to_gcc_failure_order (__order));
108
130
}
109
131
_LIBCPP_HIDE_FROM_ABI bool
110
132
compare_exchange_strong (_Tp& __expected, _Tp __desired, memory_order __order = memory_order::seq_cst) const noexcept {
111
- return __cxx_atomic_compare_exchange_strong (&__a_, &__expected, __desired, __order, __order);
133
+ return __atomic_compare_exchange (
134
+ __ptr_,
135
+ std::addressof (__expected),
136
+ std::addressof (__desired),
137
+ false ,
138
+ __to_gcc_order (__order),
139
+ __to_gcc_failure_order (__order));
112
140
}
113
141
114
142
_LIBCPP_HIDE_FROM_ABI void wait (_Tp __old, memory_order __order = memory_order::seq_cst) const noexcept
@@ -117,12 +145,18 @@ struct __atomic_ref_base {
117
145
__order == memory_order::relaxed || __order == memory_order::consume || __order == memory_order::acquire ||
118
146
__order == memory_order::seq_cst,
119
147
" memory order argument to atomic wait operation is invalid" );
120
- __cxx_atomic_wait (addressof (__a_), __old, __order);
148
+ // FIXME
149
+ (void )__old;
150
+ (void )__order;
151
+ }
152
+ _LIBCPP_HIDE_FROM_ABI void notify_one () const noexcept {
153
+ // FIXME
154
+ }
155
+ _LIBCPP_HIDE_FROM_ABI void notify_all () const noexcept {
156
+ // FIXME
121
157
}
122
- _LIBCPP_HIDE_FROM_ABI void notify_one () const noexcept { __cxx_atomic_notify_one (addressof (__a_)); }
123
- _LIBCPP_HIDE_FROM_ABI void notify_all () const noexcept { __cxx_atomic_notify_all (addressof (__a_)); }
124
158
125
- _LIBCPP_HIDE_FROM_ABI __atomic_ref_base (_Tp& __obj) : __a_( __obj) {}
159
+ _LIBCPP_HIDE_FROM_ABI __atomic_ref_base (_Tp& __obj) : __ptr_(& __obj) {}
126
160
};
127
161
128
162
template <class _Tp >
@@ -137,19 +171,19 @@ struct __atomic_ref_base<_Tp, /*_IsIntegral=*/true, /*_IsFloatingPoint=*/false>
137
171
_LIBCPP_HIDE_FROM_ABI _Tp operator =(_Tp __desired) const noexcept { return __base::operator =(__desired); }
138
172
139
173
_LIBCPP_HIDE_FROM_ABI _Tp fetch_add (_Tp __arg, memory_order __order = memory_order_seq_cst) const noexcept {
140
- return __cxx_atomic_fetch_add (& this ->__a_ , __arg, __order);
174
+ return __atomic_fetch_add ( this ->__ptr_ , __arg, __to_gcc_order ( __order) );
141
175
}
142
176
_LIBCPP_HIDE_FROM_ABI _Tp fetch_sub (_Tp __arg, memory_order __order = memory_order_seq_cst) const noexcept {
143
- return __cxx_atomic_fetch_sub (& this ->__a_ , __arg, __order);
177
+ return __atomic_fetch_sub ( this ->__ptr_ , __arg, __to_gcc_order ( __order) );
144
178
}
145
179
_LIBCPP_HIDE_FROM_ABI _Tp fetch_and (_Tp __arg, memory_order __order = memory_order_seq_cst) const noexcept {
146
- return __cxx_atomic_fetch_and (& this ->__a_ , __arg, __order);
180
+ return __atomic_fetch_and ( this ->__ptr_ , __arg, __to_gcc_order ( __order) );
147
181
}
148
182
_LIBCPP_HIDE_FROM_ABI _Tp fetch_or (_Tp __arg, memory_order __order = memory_order_seq_cst) const noexcept {
149
- return __cxx_atomic_fetch_or (& this ->__a_ , __arg, __order);
183
+ return __atomic_fetch_or ( this ->__ptr_ , __arg, __to_gcc_order ( __order) );
150
184
}
151
185
_LIBCPP_HIDE_FROM_ABI _Tp fetch_xor (_Tp __arg, memory_order __order = memory_order_seq_cst) const noexcept {
152
- return __cxx_atomic_fetch_xor (& this ->__a_ , __arg, __order);
186
+ return __atomic_fetch_xor ( this ->__ptr_ , __arg, __to_gcc_order ( __order) );
153
187
}
154
188
155
189
_LIBCPP_HIDE_FROM_ABI _Tp operator ++(int ) const noexcept { return fetch_add (_Tp (1 )); }
@@ -175,10 +209,10 @@ struct __atomic_ref_base<_Tp, /*_IsIntegral=*/false, /*_IsFloatingPoint=*/true>
175
209
_LIBCPP_HIDE_FROM_ABI _Tp operator =(_Tp __desired) const noexcept { return __base::operator =(__desired); }
176
210
177
211
_LIBCPP_HIDE_FROM_ABI _Tp fetch_add (_Tp __arg, memory_order __order = memory_order_seq_cst) const noexcept {
178
- return __cxx_atomic_fetch_add (& this ->__a_ , __arg, __order);
212
+ return __atomic_fetch_add ( this ->__ptr_ , __arg, __to_gcc_order ( __order) );
179
213
}
180
214
_LIBCPP_HIDE_FROM_ABI _Tp fetch_sub (_Tp __arg, memory_order __order = memory_order_seq_cst) const noexcept {
181
- return __cxx_atomic_fetch_sub (& this ->__a_ , __arg, __order);
215
+ return __atomic_fetch_sub ( this ->__ptr_ , __arg, __to_gcc_order ( __order) );
182
216
}
183
217
184
218
_LIBCPP_HIDE_FROM_ABI _Tp operator +=(_Tp __arg) const noexcept { return fetch_add (__arg) + __arg; }
@@ -210,10 +244,10 @@ struct atomic_ref<_Tp*> : public __atomic_ref_base<_Tp*> {
210
244
using difference_type = ptrdiff_t ;
211
245
212
246
_LIBCPP_HIDE_FROM_ABI _Tp* fetch_add (ptrdiff_t __arg, memory_order __order = memory_order_seq_cst) const noexcept {
213
- return __cxx_atomic_fetch_add (& this ->__a_ , __arg, __order);
247
+ return __atomic_fetch_add ( this ->__ptr_ , __arg * sizeof (_Tp), __to_gcc_order ( __order) );
214
248
}
215
249
_LIBCPP_HIDE_FROM_ABI _Tp* fetch_sub (ptrdiff_t __arg, memory_order __order = memory_order_seq_cst) const noexcept {
216
- return __cxx_atomic_fetch_sub (& this ->__a_ , __arg, __order);
250
+ return __atomic_fetch_sub ( this ->__ptr_ , __arg * sizeof (_Tp), __to_gcc_order ( __order) );
217
251
}
218
252
219
253
_LIBCPP_HIDE_FROM_ABI _Tp* operator ++(int ) const noexcept { return fetch_add (1 ); }
0 commit comments