Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions async_simple/FutureState.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class FutureState {
}

AS_INLINE void attachOne() {
_attached.fetch_add(1, std::memory_order_relaxed);
_attached.fetch_add(1, std::memory_order_acq_rel);
}
AS_INLINE void detachOne() {
auto old = _attached.fetch_sub(1, std::memory_order_acq_rel);
Expand All @@ -150,7 +150,7 @@ class FutureState {
}
}
AS_INLINE void attachPromise() {
_promiseRef.fetch_add(1, std::memory_order_relaxed);
_promiseRef.fetch_add(1, std::memory_order_acq_rel);
attachOne();
}
AS_INLINE void detachPromise() {
Expand Down Expand Up @@ -204,17 +204,18 @@ class FutureState {
auto state = _state.load(std::memory_order_acquire);
switch (state) {
case detail::State::START:
if (_state.compare_exchange_strong(state,
detail::State::ONLY_RESULT,
std::memory_order_release)) {
if (_state.compare_exchange_strong(
state, detail::State::ONLY_RESULT,
std::memory_order_acq_rel, std::memory_order_acquire)) {
return;
}
// state has already transfered, fallthrough
assert(_state.load(std::memory_order_relaxed) ==
detail::State::ONLY_CONTINUATION);
case detail::State::ONLY_CONTINUATION:
if (_state.compare_exchange_strong(state, detail::State::DONE,
std::memory_order_release)) {
std::memory_order_acq_rel,
std::memory_order_acquire)) {
scheduleContinuation(false);
return;
}
Expand All @@ -237,15 +238,16 @@ class FutureState {
case detail::State::START:
if (_state.compare_exchange_strong(
state, detail::State::ONLY_CONTINUATION,
std::memory_order_release)) {
std::memory_order_acq_rel, std::memory_order_acquire)) {
return;
}
// state has already transferred, fallthrough
assert(_state.load(std::memory_order_relaxed) ==
detail::State::ONLY_RESULT);
case detail::State::ONLY_RESULT:
if (_state.compare_exchange_strong(state, detail::State::DONE,
std::memory_order_release)) {
std::memory_order_acq_rel,
std::memory_order_acquire)) {
scheduleContinuation(true);
return;
}
Expand Down Expand Up @@ -308,10 +310,10 @@ class FutureState {
}

void refContinuation() {
_continuationRef.fetch_add(1, std::memory_order_relaxed);
_continuationRef.fetch_add(1, std::memory_order_acq_rel);
}
void derefContinuation() {
auto old = _continuationRef.fetch_sub(1, std::memory_order_relaxed);
auto old = _continuationRef.fetch_sub(1, std::memory_order_acq_rel);
assert(old >= 1);
if (old == 1) {
_continuation.~Continuation();
Expand Down
3 changes: 2 additions & 1 deletion async_simple/Signal.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ class Signal : public std::enable_shared_from_this<Signal> {
validSignal = (expected | type) ^ expected;
} while (validSignal &&
!state.compare_exchange_weak(expected, expected | type,
std::memory_order_release));
std::memory_order_acq_rel,
std::memory_order_acquire));
// high 32 bits signal is always valid, they can be trigger multiple
// times. low 32 bits signal only trigger once.
return static_cast<SignalType>(validSignal |
Expand Down
16 changes: 8 additions & 8 deletions async_simple/coro/ConditionVariable.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ class ConditionVariableAwaiter {
do {
_next = awaitings;
} while (!_cv->_awaiters.compare_exchange_weak(
awaitings, this, std::memory_order_acquire,
std::memory_order_relaxed));
awaitings, this, std::memory_order_release,
std::memory_order_acquire));
}
void await_resume() const noexcept {}

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

template <class Lock>
inline void ConditionVariable<Lock>::notifyAll() noexcept {
auto awaitings = _awaiters.load(std::memory_order_relaxed);
auto awaitings = _awaiters.load(std::memory_order_acquire);
while (!_awaiters.compare_exchange_weak(awaitings, nullptr,
std::memory_order_release,
std::memory_order_relaxed))
std::memory_order_acq_rel,
std::memory_order_acquire))
;
resumeWaiters(awaitings);
}

template <class Lock>
inline void ConditionVariable<Lock>::notifyOne() noexcept {
auto awaitings = _awaiters.load(std::memory_order_relaxed);
auto awaitings = _awaiters.load(std::memory_order_acquire);
if (!awaitings) {
return;
}
while (!_awaiters.compare_exchange_weak(awaitings, awaitings->_next,
std::memory_order_release,
std::memory_order_relaxed))
std::memory_order_acq_rel,
std::memory_order_acquire))
;
awaitings->_next = nullptr;
resumeWaiters(awaitings);
Expand Down
Loading