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); } }