1
#ifndef BOOST_ATOMIC_DETAIL_CAS64STRONG_HPP
2
#define BOOST_ATOMIC_DETAIL_CAS64STRONG_HPP
4
// Distributed under the Boost Software License, Version 1.0.
5
// See accompanying file LICENSE_1_0.txt or copy at
6
// http://www.boost.org/LICENSE_1_0.txt)
8
// Copyright (c) 2011 Helge Bahmann
9
// Copyright (c) 2013 Tim Blechmann
11
// Build 64-bit atomic operation on integers/UDTs from platform_cmpxchg64_strong
12
// primitive. It is assumed that 64-bit loads/stores are not
13
// atomic, so they are implemented through platform_load64/platform_store64.
17
#include <boost/cstdint.hpp>
18
#include <boost/memory_order.hpp>
19
#include <boost/atomic/detail/config.hpp>
20
#include <boost/atomic/detail/base.hpp>
22
#ifdef BOOST_HAS_PRAGMA_ONCE
32
template<typename T, bool Sign>
33
class base_atomic<T, int, 8, Sign>
36
typedef base_atomic this_type;
38
typedef T difference_type;
41
typedef value_type value_arg_type;
44
BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
45
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
48
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
50
platform_fence_before_store(order);
51
platform_store64(v, &v_);
52
platform_fence_after_store(order);
56
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
58
value_type v = platform_load64(&v_);
59
platform_fence_after_load(order);
64
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
66
value_type original = load(memory_order_relaxed);
68
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
73
compare_exchange_weak(
74
value_type & expected,
76
memory_order success_order,
77
memory_order failure_order) volatile BOOST_NOEXCEPT
79
return compare_exchange_strong(expected, desired, success_order, failure_order);
83
compare_exchange_strong(
84
value_type & expected,
86
memory_order success_order,
87
memory_order failure_order) volatile BOOST_NOEXCEPT
89
platform_fence_before(success_order);
91
bool success = platform_cmpxchg64_strong(expected, desired, &v_);
94
platform_fence_after(success_order);
96
platform_fence_after(failure_order);
103
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
105
value_type original = load(memory_order_relaxed);
107
} while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
112
fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
114
value_type original = load(memory_order_relaxed);
116
} while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
121
fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
123
value_type original = load(memory_order_relaxed);
125
} while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
130
fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
132
value_type original = load(memory_order_relaxed);
134
} while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
139
fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
141
value_type original = load(memory_order_relaxed);
143
} while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
148
is_lock_free(void) const volatile BOOST_NOEXCEPT
153
BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
155
BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
156
BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
164
template<typename T, bool Sign>
165
class base_atomic<T, void, 8, Sign>
168
typedef base_atomic this_type;
169
typedef T value_type;
170
typedef uint64_t storage_type;
173
typedef value_type const& value_arg_type;
176
BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
177
explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
179
memcpy(&v_, &v, sizeof(value_type));
183
store(value_type const& value, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
185
storage_type value_s = 0;
186
memcpy(&value_s, &value, sizeof(value_type));
187
platform_fence_before_store(order);
188
platform_store64(value_s, &v_);
189
platform_fence_after_store(order);
193
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
195
storage_type value_s = platform_load64(&v_);
196
platform_fence_after_load(order);
198
memcpy(&value, &value_s, sizeof(value_type));
203
exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
205
value_type original = load(memory_order_relaxed);
207
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
212
compare_exchange_weak(
213
value_type & expected,
214
value_type const& desired,
215
memory_order success_order,
216
memory_order failure_order) volatile BOOST_NOEXCEPT
218
return compare_exchange_strong(expected, desired, success_order, failure_order);
222
compare_exchange_strong(
223
value_type & expected,
224
value_type const& desired,
225
memory_order success_order,
226
memory_order failure_order) volatile BOOST_NOEXCEPT
228
storage_type expected_s = 0, desired_s = 0;
229
memcpy(&expected_s, &expected, sizeof(value_type));
230
memcpy(&desired_s, &desired, sizeof(value_type));
232
platform_fence_before(success_order);
233
bool success = platform_cmpxchg64_strong(expected_s, desired_s, &v_);
236
platform_fence_after(success_order);
238
platform_fence_after(failure_order);
239
memcpy(&expected, &expected_s, sizeof(value_type));
246
is_lock_free(void) const volatile BOOST_NOEXCEPT
251
BOOST_ATOMIC_DECLARE_BASE_OPERATORS
253
BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
254
BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))