Introduce stricter ordering for access to mDone atomic in NRT wrapper (#30)

This works perfectly
nix
weefuzzy 4 years ago committed by GitHub
parent 11f9423426
commit e5c75cf3bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -342,7 +342,7 @@ private:
auto& ar = *args; auto& ar = *args;
if (auto ptr = get(NRTCommand::mID).lock()) 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<ParamsFromOSC>(nullptr, world, mParams.template setParameterValuesRT<ParamsFromOSC>(nullptr, world,
ar); ar);
mSynchronous = static_cast<bool>(ar.geti()); mSynchronous = static_cast<bool>(ar.geti());
@ -397,13 +397,13 @@ private:
if (result.status() != Result::Status::kError) 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(); mResult = client.process();
Wrapper::printResult(world, mResult); Wrapper::printResult(world, mResult);
bool error = mResult.status() == Result::Status::kError; 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; bool toStage3 = mSynchronous && !error;
return toStage3; return toStage3;
} }
@ -439,7 +439,7 @@ private:
if (NRTCommand::mID >= 0 && mSynchronous) if (NRTCommand::mID >= 0 && mSynchronous)
NRTCommand::sendReply(name(), NRTCommand::sendReply(name(),
mResult.status() != Result::Status::kError); mResult.status() != Result::Status::kError);
ptr->mDone.store(true, std::memory_order_relaxed); ptr->mDone.store(true, std::memory_order_release);
return true; return true;
} }
return false; return false;
@ -489,7 +489,7 @@ private:
{ {
std::cout << Wrapper::getName() << ": Processing cancelled" std::cout << Wrapper::getName() << ": Processing cancelled"
<< std::endl; << std::endl;
ptr->mDone.store(true, std::memory_order_relaxed); ptr->mDone.store(true, std::memory_order_release);
return false; return false;
} }
@ -498,7 +498,7 @@ private:
Wrapper::printResult(world, r); Wrapper::printResult(world, r);
if (!mSuccess) if (!mSuccess)
{ {
ptr->mDone.store(true, std::memory_order_relaxed); ptr->mDone.store(true, std::memory_order_release);
return false; return false;
} }
// if we're progressing to stage3, don't unlock the lock just yet // if we're progressing to stage3, don't unlock the lock just yet
@ -530,7 +530,7 @@ private:
NRTCommand::sendReply(name(), mSuccess); NRTCommand::sendReply(name(), mSuccess);
} }
ptr->mDone.store(true, std::memory_order_relaxed); // = true; ptr->mDone.store(true, std::memory_order_release); // = true;
return true; return true;
} }
std::cout << "ERROR: Failed to lock\n"; std::cout << "ERROR: Failed to lock\n";
@ -826,7 +826,7 @@ private:
if (auto ptr = mRecord.lock()) if (auto ptr = mRecord.lock())
{ {
mInit = true; mInit = true;
mDone = ptr->mDone.load(std::memory_order_relaxed); mDone = ptr->mDone.load(std::memory_order_acquire);
out0(0) = static_cast<float>(ptr->mClient.progress()); out0(0) = static_cast<float>(ptr->mClient.progress());
} }
else else
@ -940,7 +940,7 @@ private:
{ {
mInit = true; mInit = true;
auto& client = ptr->mClient; 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<float>(client.progress()); out0(0) = mDone ? 1 : static_cast<float>(client.progress());
} }
else else

Loading…
Cancel
Save