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;
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,
ar);
mSynchronous = static_cast<bool>(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<float>(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<float>(client.progress());
}
else

Loading…
Cancel
Save