Skip to content

Commit 12c2a72

Browse files
authored
try to fix aarch64 memory order (#448)
1 parent 82f2b09 commit 12c2a72

3 files changed

Lines changed: 22 additions & 19 deletions

File tree

async_simple/FutureState.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class FutureState {
140140
}
141141

142142
AS_INLINE void attachOne() {
143-
_attached.fetch_add(1, std::memory_order_relaxed);
143+
_attached.fetch_add(1, std::memory_order_acq_rel);
144144
}
145145
AS_INLINE void detachOne() {
146146
auto old = _attached.fetch_sub(1, std::memory_order_acq_rel);
@@ -150,7 +150,7 @@ class FutureState {
150150
}
151151
}
152152
AS_INLINE void attachPromise() {
153-
_promiseRef.fetch_add(1, std::memory_order_relaxed);
153+
_promiseRef.fetch_add(1, std::memory_order_acq_rel);
154154
attachOne();
155155
}
156156
AS_INLINE void detachPromise() {
@@ -204,17 +204,18 @@ class FutureState {
204204
auto state = _state.load(std::memory_order_acquire);
205205
switch (state) {
206206
case detail::State::START:
207-
if (_state.compare_exchange_strong(state,
208-
detail::State::ONLY_RESULT,
209-
std::memory_order_release)) {
207+
if (_state.compare_exchange_strong(
208+
state, detail::State::ONLY_RESULT,
209+
std::memory_order_acq_rel, std::memory_order_acquire)) {
210210
return;
211211
}
212212
// state has already transfered, fallthrough
213213
assert(_state.load(std::memory_order_relaxed) ==
214214
detail::State::ONLY_CONTINUATION);
215215
case detail::State::ONLY_CONTINUATION:
216216
if (_state.compare_exchange_strong(state, detail::State::DONE,
217-
std::memory_order_release)) {
217+
std::memory_order_acq_rel,
218+
std::memory_order_acquire)) {
218219
scheduleContinuation(false);
219220
return;
220221
}
@@ -237,15 +238,16 @@ class FutureState {
237238
case detail::State::START:
238239
if (_state.compare_exchange_strong(
239240
state, detail::State::ONLY_CONTINUATION,
240-
std::memory_order_release)) {
241+
std::memory_order_acq_rel, std::memory_order_acquire)) {
241242
return;
242243
}
243244
// state has already transferred, fallthrough
244245
assert(_state.load(std::memory_order_relaxed) ==
245246
detail::State::ONLY_RESULT);
246247
case detail::State::ONLY_RESULT:
247248
if (_state.compare_exchange_strong(state, detail::State::DONE,
248-
std::memory_order_release)) {
249+
std::memory_order_acq_rel,
250+
std::memory_order_acquire)) {
249251
scheduleContinuation(true);
250252
return;
251253
}
@@ -308,10 +310,10 @@ class FutureState {
308310
}
309311

310312
void refContinuation() {
311-
_continuationRef.fetch_add(1, std::memory_order_relaxed);
313+
_continuationRef.fetch_add(1, std::memory_order_acq_rel);
312314
}
313315
void derefContinuation() {
314-
auto old = _continuationRef.fetch_sub(1, std::memory_order_relaxed);
316+
auto old = _continuationRef.fetch_sub(1, std::memory_order_acq_rel);
315317
assert(old >= 1);
316318
if (old == 1) {
317319
_continuation.~Continuation();

async_simple/Signal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ class Signal : public std::enable_shared_from_this<Signal> {
8080
validSignal = (expected | type) ^ expected;
8181
} while (validSignal &&
8282
!state.compare_exchange_weak(expected, expected | type,
83-
std::memory_order_release));
83+
std::memory_order_acq_rel,
84+
std::memory_order_acquire));
8485
// high 32 bits signal is always valid, they can be trigger multiple
8586
// times. low 32 bits signal only trigger once.
8687
return static_cast<SignalType>(validSignal |

async_simple/coro/ConditionVariable.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ class ConditionVariableAwaiter {
6767
do {
6868
_next = awaitings;
6969
} while (!_cv->_awaiters.compare_exchange_weak(
70-
awaitings, this, std::memory_order_acquire,
71-
std::memory_order_relaxed));
70+
awaitings, this, std::memory_order_release,
71+
std::memory_order_acquire));
7272
}
7373
void await_resume() const noexcept {}
7474

@@ -94,23 +94,23 @@ inline Lazy<> ConditionVariable<Lock>::wait(Lock& lock, Pred&& pred) noexcept {
9494

9595
template <class Lock>
9696
inline void ConditionVariable<Lock>::notifyAll() noexcept {
97-
auto awaitings = _awaiters.load(std::memory_order_relaxed);
97+
auto awaitings = _awaiters.load(std::memory_order_acquire);
9898
while (!_awaiters.compare_exchange_weak(awaitings, nullptr,
99-
std::memory_order_release,
100-
std::memory_order_relaxed))
99+
std::memory_order_acq_rel,
100+
std::memory_order_acquire))
101101
;
102102
resumeWaiters(awaitings);
103103
}
104104

105105
template <class Lock>
106106
inline void ConditionVariable<Lock>::notifyOne() noexcept {
107-
auto awaitings = _awaiters.load(std::memory_order_relaxed);
107+
auto awaitings = _awaiters.load(std::memory_order_acquire);
108108
if (!awaitings) {
109109
return;
110110
}
111111
while (!_awaiters.compare_exchange_weak(awaitings, awaitings->_next,
112-
std::memory_order_release,
113-
std::memory_order_relaxed))
112+
std::memory_order_acq_rel,
113+
std::memory_order_acquire))
114114
;
115115
awaitings->_next = nullptr;
116116
resumeWaiters(awaitings);

0 commit comments

Comments
 (0)