30#ifndef _SHARED_PTR_ATOMIC_H
31#define _SHARED_PTR_ATOMIC_H 1
35namespace std _GLIBCXX_VISIBILITY(default)
37_GLIBCXX_BEGIN_NAMESPACE_VERSION
46 _Sp_locker(
const _Sp_locker&) =
delete;
47 _Sp_locker& operator=(
const _Sp_locker&) =
delete;
51 _Sp_locker(
const void*)
noexcept;
52 _Sp_locker(
const void*,
const void*)
noexcept;
56 unsigned char _M_key1;
57 unsigned char _M_key2;
59 explicit _Sp_locker(
const void*,
const void* =
nullptr) { }
69 template<
typename _Tp, _Lock_policy _Lp>
71 atomic_is_lock_free(
const __shared_ptr<_Tp, _Lp>* __p)
74 return __gthread_active_p() == 0;
80 template<
typename _Tp>
83 {
return std::atomic_is_lock_free<_Tp, __default_lock_policy>(__p); }
96 template<
typename _Tp>
97 inline shared_ptr<_Tp>
100 _Sp_locker __lock{__p};
104 template<
typename _Tp>
105 inline shared_ptr<_Tp>
107 {
return std::atomic_load_explicit(__p, memory_order_seq_cst); }
109 template<
typename _Tp, _Lock_policy _Lp>
110 inline __shared_ptr<_Tp, _Lp>
113 _Sp_locker __lock{__p};
117 template<
typename _Tp, _Lock_policy _Lp>
118 inline __shared_ptr<_Tp, _Lp>
119 atomic_load(
const __shared_ptr<_Tp, _Lp>* __p)
120 {
return std::atomic_load_explicit(__p, memory_order_seq_cst); }
132 template<
typename _Tp>
137 _Sp_locker __lock{__p};
141 template<
typename _Tp>
144 { std::atomic_store_explicit(__p, std::move(__r), memory_order_seq_cst); }
146 template<
typename _Tp, _Lock_policy _Lp>
148 atomic_store_explicit(__shared_ptr<_Tp, _Lp>* __p,
149 __shared_ptr<_Tp, _Lp> __r,
152 _Sp_locker __lock{__p};
156 template<
typename _Tp, _Lock_policy _Lp>
158 atomic_store(__shared_ptr<_Tp, _Lp>* __p, __shared_ptr<_Tp, _Lp> __r)
159 { std::atomic_store_explicit(__p, std::move(__r), memory_order_seq_cst); }
169 template<
typename _Tp>
170 inline shared_ptr<_Tp>
174 _Sp_locker __lock{__p};
179 template<
typename _Tp>
180 inline shared_ptr<_Tp>
183 return std::atomic_exchange_explicit(__p, std::move(__r),
184 memory_order_seq_cst);
187 template<
typename _Tp, _Lock_policy _Lp>
188 inline __shared_ptr<_Tp, _Lp>
189 atomic_exchange_explicit(__shared_ptr<_Tp, _Lp>* __p,
190 __shared_ptr<_Tp, _Lp> __r,
193 _Sp_locker __lock{__p};
198 template<
typename _Tp, _Lock_policy _Lp>
199 inline __shared_ptr<_Tp, _Lp>
200 atomic_exchange(__shared_ptr<_Tp, _Lp>* __p, __shared_ptr<_Tp, _Lp> __r)
202 return std::atomic_exchange_explicit(__p, std::move(__r),
203 memory_order_seq_cst);
218 template<
typename _Tp>
227 _Sp_locker __lock{__p, __v};
229 if (*__p == *__v && !__less(*__p, *__v) && !__less(*__v, *__p))
231 __x = std::move(*__p);
232 *__p = std::move(__w);
235 __x = std::move(*__v);
240 template<
typename _Tp>
245 return std::atomic_compare_exchange_strong_explicit(__p, __v,
246 std::move(__w), memory_order_seq_cst, memory_order_seq_cst);
249 template<
typename _Tp>
257 return std::atomic_compare_exchange_strong_explicit(__p, __v,
258 std::move(__w), __success, __failure);
261 template<
typename _Tp>
266 return std::atomic_compare_exchange_weak_explicit(__p, __v,
267 std::move(__w), memory_order_seq_cst, memory_order_seq_cst);
270 template<
typename _Tp, _Lock_policy _Lp>
272 atomic_compare_exchange_strong_explicit(__shared_ptr<_Tp, _Lp>* __p,
273 __shared_ptr<_Tp, _Lp>* __v,
274 __shared_ptr<_Tp, _Lp> __w,
278 __shared_ptr<_Tp, _Lp> __x;
279 _Sp_locker __lock{__p, __v};
281 if (*__p == *__v && !__less(*__p, *__v) && !__less(*__v, *__p))
283 __x = std::move(*__p);
284 *__p = std::move(__w);
287 __x = std::move(*__v);
292 template<
typename _Tp, _Lock_policy _Lp>
294 atomic_compare_exchange_strong(__shared_ptr<_Tp, _Lp>* __p,
295 __shared_ptr<_Tp, _Lp>* __v,
296 __shared_ptr<_Tp, _Lp> __w)
298 return std::atomic_compare_exchange_strong_explicit(__p, __v,
299 std::move(__w), memory_order_seq_cst, memory_order_seq_cst);
302 template<
typename _Tp, _Lock_policy _Lp>
304 atomic_compare_exchange_weak_explicit(__shared_ptr<_Tp, _Lp>* __p,
305 __shared_ptr<_Tp, _Lp>* __v,
306 __shared_ptr<_Tp, _Lp> __w,
310 return std::atomic_compare_exchange_strong_explicit(__p, __v,
311 std::move(__w), __success, __failure);
314 template<
typename _Tp, _Lock_policy _Lp>
316 atomic_compare_exchange_weak(__shared_ptr<_Tp, _Lp>* __p,
317 __shared_ptr<_Tp, _Lp>* __v,
318 __shared_ptr<_Tp, _Lp> __w)
320 return std::atomic_compare_exchange_weak_explicit(__p, __v,
321 std::move(__w), memory_order_seq_cst, memory_order_seq_cst);
327_GLIBCXX_END_NAMESPACE_VERSION
memory_order
Enumeration for memory_order.
ISO C++ entities toplevel namespace is std.
A smart pointer with reference-counted copy semantics.
Primary template owner_less.