From 785be453f64c79ef054021a4c8b376d0b6a98fd1 Mon Sep 17 00:00:00 2001 From: Gary Pennington Date: Wed, 14 Jun 2023 15:23:12 +0100 Subject: [PATCH] remove a race from the hashing write() Calling load() and store() separately leaves a lot of opportunity for a race to occur. This changes the logic to use compare_exchange() and will only return if the previous value is absolutely not 1 at the point of comparison. I also don't think this needs to be SeqCst, so relaxing that requirement a little. --- src/config/hashing.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/config/hashing.rs b/src/config/hashing.rs index 2ac19199..986ed836 100644 --- a/src/config/hashing.rs +++ b/src/config/hashing.rs @@ -50,14 +50,17 @@ impl HokmaLock { pub fn write(&'static self) -> WhenTheHokmaSuppression { loop { - let previous = self.lock.load(Ordering::SeqCst); - self.lock.store(1, Ordering::SeqCst); - - if previous != 1 { - return WhenTheHokmaSuppression { - hokma: self, - state: previous, - }; + // We are only interested in error results + if let Err(previous) = self + .lock + .compare_exchange(1, 1, Ordering::Acquire, Ordering::Relaxed) + { + if previous != 1 { + return WhenTheHokmaSuppression { + hokma: self, + state: previous, + }; + } } } }