Skip to content

Commit f0977ac

Browse files
committed
Fixes to swift::atomic: load is const, provide a store.
1 parent 930c72a commit f0977ac

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

include/swift/Runtime/Atomic.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,15 @@ class alignas(Size) atomic_impl {
5353
constexpr atomic_impl(Value value) : value(value) {}
5454

5555
/// Force clients to always pass an order.
56-
Value load(std::memory_order order) {
56+
Value load(std::memory_order order) const {
5757
return value.load(order);
5858
}
5959

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+
6065
/// Force clients to always pass an order.
6166
bool compare_exchange_weak(Value &oldValue, Value newValue,
6267
std::memory_order successOrder,
@@ -75,14 +80,14 @@ class alignas(Size) atomic_impl {
7580
/// AMD processors that lack cmpxchg16b, so we just use the intrinsic.
7681
template <class Value>
7782
class alignas(2 * sizeof(void*)) atomic_impl<Value, 2 * sizeof(void*)> {
78-
volatile Value atomicValue;
83+
mutable volatile Value atomicValue;
7984
public:
8085
constexpr atomic_impl(Value initialValue) : atomicValue(initialValue) {}
8186

8287
atomic_impl(const atomic_impl &) = delete;
8388
atomic_impl &operator=(const atomic_impl &) = delete;
8489

85-
Value load(std::memory_order order) {
90+
Value load(std::memory_order order) const {
8691
assert(order == std::memory_order_relaxed ||
8792
order == std::memory_order_acquire ||
8893
order == std::memory_order_consume);
@@ -107,6 +112,17 @@ class alignas(2 * sizeof(void*)) atomic_impl<Value, 2 * sizeof(void*)> {
107112
return reinterpret_cast<Value &>(resultArray);
108113
}
109114

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+
110126
bool compare_exchange_weak(Value &oldValue, Value newValue,
111127
std::memory_order successOrder,
112128
std::memory_order failureOrder) {

0 commit comments

Comments
 (0)