From e5c75cf3bb636a41a4b69fef03d34ba88833b6b2 Mon Sep 17 00:00:00 2001 From: weefuzzy Date: Thu, 4 Nov 2021 16:47:26 +0000 Subject: [PATCH] Introduce stricter ordering for access to mDone atomic in NRT wrapper (#30) This works perfectly --- include/wrapper/NonRealtime.hpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/include/wrapper/NonRealtime.hpp b/include/wrapper/NonRealtime.hpp index 93159df..61598af 100644 --- a/include/wrapper/NonRealtime.hpp +++ b/include/wrapper/NonRealtime.hpp @@ -342,7 +342,7 @@ private: auto& ar = *args; if (auto ptr = get(NRTCommand::mID).lock()) { - ptr->mDone.store(false, std::memory_order_relaxed); + ptr->mDone.store(false, std::memory_order_release); mParams.template setParameterValuesRT(nullptr, world, ar); mSynchronous = static_cast(ar.geti()); @@ -397,13 +397,13 @@ private: if (result.status() != Result::Status::kError) { - ptr->mDone.store(false, std::memory_order_relaxed); + ptr->mDone.store(false, std::memory_order_release); mResult = client.process(); Wrapper::printResult(world, mResult); bool error = mResult.status() == Result::Status::kError; - if (error) ptr->mDone.store(true, std::memory_order_relaxed); + if (error) ptr->mDone.store(true, std::memory_order_release); bool toStage3 = mSynchronous && !error; return toStage3; } @@ -439,7 +439,7 @@ private: if (NRTCommand::mID >= 0 && mSynchronous) NRTCommand::sendReply(name(), mResult.status() != Result::Status::kError); - ptr->mDone.store(true, std::memory_order_relaxed); + ptr->mDone.store(true, std::memory_order_release); return true; } return false; @@ -489,7 +489,7 @@ private: { std::cout << Wrapper::getName() << ": Processing cancelled" << std::endl; - ptr->mDone.store(true, std::memory_order_relaxed); + ptr->mDone.store(true, std::memory_order_release); return false; } @@ -498,7 +498,7 @@ private: Wrapper::printResult(world, r); if (!mSuccess) { - ptr->mDone.store(true, std::memory_order_relaxed); + ptr->mDone.store(true, std::memory_order_release); return false; } // if we're progressing to stage3, don't unlock the lock just yet @@ -530,7 +530,7 @@ private: NRTCommand::sendReply(name(), mSuccess); } - ptr->mDone.store(true, std::memory_order_relaxed); // = true; + ptr->mDone.store(true, std::memory_order_release); // = true; return true; } std::cout << "ERROR: Failed to lock\n"; @@ -826,7 +826,7 @@ private: if (auto ptr = mRecord.lock()) { mInit = true; - mDone = ptr->mDone.load(std::memory_order_relaxed); + mDone = ptr->mDone.load(std::memory_order_acquire); out0(0) = static_cast(ptr->mClient.progress()); } else @@ -940,7 +940,7 @@ private: { mInit = true; auto& client = ptr->mClient; - mDone = ptr->mDone.load(std::memory_order_relaxed); + mDone = ptr->mDone.load(std::memory_order_acquire); out0(0) = mDone ? 1 : static_cast(client.progress()); } else