From 1d695612c4403ec83b70b95a9b52d8f59ae3a94a Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 16 Mar 2022 10:40:32 -0500 Subject: [PATCH] strengthen signals-received atomics (#5132) * strengthen signals-received atomics * Update node/overseer/overseer-gen/src/lib.rs Co-authored-by: Andrei Sandu <54316454+sandreim@users.noreply.github.com> * fmt Co-authored-by: Andrei Sandu <54316454+sandreim@users.noreply.github.com> --- polkadot/node/overseer/overseer-gen/src/lib.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/polkadot/node/overseer/overseer-gen/src/lib.rs b/polkadot/node/overseer/overseer-gen/src/lib.rs index 95eb56166d..0d926ead2d 100644 --- a/polkadot/node/overseer/overseer-gen/src/lib.rs +++ b/polkadot/node/overseer/overseer-gen/src/lib.rs @@ -196,13 +196,15 @@ pub struct SignalsReceived(Arc); impl SignalsReceived { /// Load the current value of received signals. pub fn load(&self) -> usize { - // off by a few is ok - self.0.load(atomic::Ordering::Relaxed) + // It's imperative that we prevent reading a stale value from memory because of reordering. + // Memory barrier to ensure that no reads or writes in the current thread before this load are reordered. + // All writes in other threads using release semantics become visible to the current thread. + self.0.load(atomic::Ordering::Acquire) } /// Increase the number of signals by one. pub fn inc(&self) { - self.0.fetch_add(1, atomic::Ordering::Acquire); + self.0.fetch_add(1, atomic::Ordering::AcqRel); } }