30 #ifndef _SHARED_PTR_ATOMIC_H
31 #define _SHARED_PTR_ATOMIC_H 1
35 namespace 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>
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>
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>
132 template<
typename _Tp>
137 _Sp_locker __lock{__p};
141 template<
typename _Tp>
146 template<
typename _Tp, _Lock_policy _Lp>
149 __shared_ptr<_Tp, _Lp> __r,
152 _Sp_locker __lock{__p};
156 template<
typename _Tp, _Lock_policy _Lp>
169 template<
typename _Tp>
170 inline shared_ptr<_Tp>
174 _Sp_locker __lock{__p};
179 template<
typename _Tp>
180 inline shared_ptr<_Tp>
184 memory_order_seq_cst);
187 template<
typename _Tp, _Lock_policy _Lp>
188 inline __shared_ptr<_Tp, _Lp>
190 __shared_ptr<_Tp, _Lp> __r,
193 _Sp_locker __lock{__p};
198 template<
typename _Tp, _Lock_policy _Lp>
199 inline __shared_ptr<_Tp, _Lp>
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))
240 template<
typename _Tp>
246 std::move(__w), memory_order_seq_cst, memory_order_seq_cst);
249 template<
typename _Tp>
261 template<
typename _Tp>
267 std::move(__w), memory_order_seq_cst, memory_order_seq_cst);
270 template<
typename _Tp, _Lock_policy _Lp>
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))
292 template<
typename _Tp, _Lock_policy _Lp>
295 __shared_ptr<_Tp, _Lp>* __v,
296 __shared_ptr<_Tp, _Lp> __w)
299 std::move(__w), memory_order_seq_cst, memory_order_seq_cst);
302 template<
typename _Tp, _Lock_policy _Lp>
305 __shared_ptr<_Tp, _Lp>* __v,
306 __shared_ptr<_Tp, _Lp> __w,
314 template<
typename _Tp, _Lock_policy _Lp>
317 __shared_ptr<_Tp, _Lp>* __v,
318 __shared_ptr<_Tp, _Lp> __w)
321 std::move(__w), memory_order_seq_cst, memory_order_seq_cst);
327 _GLIBCXX_END_NAMESPACE_VERSION
330 #endif // _SHARED_PTR_ATOMIC_H
memory_order
Enumeration for memory_order.
bool atomic_compare_exchange_strong(shared_ptr< _Tp > *__p, shared_ptr< _Tp > *__v, shared_ptr< _Tp > __w)
Atomic compare-and-swap for shared_ptr objects.
bool atomic_is_lock_free(const __shared_ptr< _Tp, _Lp > *__p)
Report whether shared_ptr atomic operations are lock-free.
void atomic_store_explicit(shared_ptr< _Tp > *__p, shared_ptr< _Tp > __r, memory_order)
Atomic store for shared_ptr objects.
shared_ptr< _Tp > atomic_exchange(shared_ptr< _Tp > *__p, shared_ptr< _Tp > __r)
Atomic exchange for shared_ptr objects.
bool atomic_compare_exchange_strong_explicit(shared_ptr< _Tp > *__p, shared_ptr< _Tp > *__v, shared_ptr< _Tp > __w, memory_order, memory_order)
Atomic compare-and-swap for shared_ptr objects.
bool atomic_compare_exchange_weak(shared_ptr< _Tp > *__p, shared_ptr< _Tp > *__v, shared_ptr< _Tp > __w)
Atomic compare-and-swap for shared_ptr objects.
void atomic_store(shared_ptr< _Tp > *__p, shared_ptr< _Tp > __r)
Atomic store for shared_ptr objects.
Primary template owner_less.
bool atomic_compare_exchange_weak_explicit(shared_ptr< _Tp > *__p, shared_ptr< _Tp > *__v, shared_ptr< _Tp > __w, memory_order __success, memory_order __failure)
Atomic compare-and-swap for shared_ptr objects.
shared_ptr< _Tp > atomic_load_explicit(const shared_ptr< _Tp > *__p, memory_order)
Atomic load for shared_ptr objects.
shared_ptr< _Tp > atomic_exchange_explicit(shared_ptr< _Tp > *__p, shared_ptr< _Tp > __r, memory_order)
Atomic exchange for shared_ptr objects.
shared_ptr< _Tp > atomic_load(const shared_ptr< _Tp > *__p)
Atomic load for shared_ptr objects.
ISO C++ entities toplevel namespace is std.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
A smart pointer with reference-counted copy semantics.