@@ -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 ();
0 commit comments