@@ -53,10 +53,15 @@ class alignas(Size) atomic_impl {
53
53
constexpr atomic_impl (Value value) : value (value) {}
54
54
55
55
// / Force clients to always pass an order.
56
- Value load (std::memory_order order) {
56
+ Value load (std::memory_order order) const {
57
57
return value.load (order);
58
58
}
59
59
60
+ // / Force clients to always pass an order.
61
+ void store (Value newValue, std::memory_order order) {
62
+ return value.store (newValue, order);
63
+ }
64
+
60
65
// / Force clients to always pass an order.
61
66
bool compare_exchange_weak (Value &oldValue, Value newValue,
62
67
std::memory_order successOrder,
@@ -75,14 +80,14 @@ class alignas(Size) atomic_impl {
75
80
// / AMD processors that lack cmpxchg16b, so we just use the intrinsic.
76
81
template <class Value >
77
82
class alignas (2 * sizeof (void *)) atomic_impl<Value, 2 * sizeof (void *)> {
78
- volatile Value atomicValue;
83
+ mutable volatile Value atomicValue;
79
84
public:
80
85
constexpr atomic_impl (Value initialValue) : atomicValue (initialValue) {}
81
86
82
87
atomic_impl (const atomic_impl &) = delete ;
83
88
atomic_impl &operator =(const atomic_impl &) = delete ;
84
89
85
- Value load (std::memory_order order) {
90
+ Value load (std::memory_order order) const {
86
91
assert (order == std::memory_order_relaxed ||
87
92
order == std::memory_order_acquire ||
88
93
order == std::memory_order_consume);
@@ -107,6 +112,17 @@ class alignas(2 * sizeof(void*)) atomic_impl<Value, 2 * sizeof(void*)> {
107
112
return reinterpret_cast <Value &>(resultArray);
108
113
}
109
114
115
+ void store (Value newValue, std::memory_order order) {
116
+ assert (order == std::memory_order_relaxed ||
117
+ order == std::memory_order_release);
118
+ Value oldValue = load (std::memory_order_relaxed);
119
+ while (!compare_exchange_weak (oldValue, newValue,
120
+ /* success*/ order,
121
+ /* failure*/ std::memory_order_relaxed)) {
122
+ // try again
123
+ }
124
+ }
125
+
110
126
bool compare_exchange_weak (Value &oldValue, Value newValue,
111
127
std::memory_order successOrder,
112
128
std::memory_order failureOrder) {
0 commit comments