From 6bffb44d2bcca4989945e4d76ce8d35cf8cdcebd Mon Sep 17 00:00:00 2001 From: Denis Blank Date: Tue, 3 Nov 2020 17:26:20 +0100 Subject: [PATCH] Fix a race condition in cti::transforms::wait() * Thanks to p4654545 for reporting this issue and providing a reproducible example * Closes #38 --- include/continuable/detail/transforms/wait.hpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/include/continuable/detail/transforms/wait.hpp b/include/continuable/detail/transforms/wait.hpp index 02ae9be..b24b4b0 100644 --- a/include/continuable/detail/transforms/wait.hpp +++ b/include/continuable/detail/transforms/wait.hpp @@ -81,24 +81,26 @@ Result wait_relaxed(continuable_base&& continuable) { return std::move(continuable).unpack(); } - std::mutex cv_mutex; condition_variable_t cv; - std::atomic_bool ready{false}; + std::mutex cv_mutex; + + bool ready{false}; Result sync_result; std::move(continuable) .next([&](auto&&... args) { sync_result = Result::from(std::forward(args)...); - ready.store(true, std::memory_order_release); + lock_t lock(cv_mutex); + ready = true; cv.notify_all(); }) .done(); - if (!ready.load(std::memory_order_acquire)) { - lock_t lock(cv_mutex); + lock_t lock(cv_mutex); + if (!ready) { cv.wait(lock, [&] { - return ready.load(std::memory_order_acquire); + return ready; }); }