From ded782f1bdc4319ad2f294688eaf90f3061a1720 Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Sun, 8 Nov 2020 21:44:43 +0000 Subject: [PATCH] RawRwLock::wait_for_readers needs an Acquire to synchronize with unlock_shared Fixes #257 --- src/raw_rwlock.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/raw_rwlock.rs b/src/raw_rwlock.rs index 1feb0bd2..75a98128 100644 --- a/src/raw_rwlock.rs +++ b/src/raw_rwlock.rs @@ -970,11 +970,11 @@ impl RawRwLock { // At this point WRITER_BIT is already set, we just need to wait for the // remaining readers to exit the lock. let mut spinwait = SpinWait::new(); - let mut state = self.state.load(Ordering::Relaxed); + let mut state = self.state.load(Ordering::Acquire); while state & READERS_MASK != 0 { // Spin a few times to wait for readers to exit if spinwait.spin() { - state = self.state.load(Ordering::Relaxed); + state = self.state.load(Ordering::Acquire); continue; } @@ -1019,7 +1019,7 @@ impl RawRwLock { // since a previous writer timing-out could have allowed // another reader to sneak in before we parked. ParkResult::Unparked(_) | ParkResult::Invalid => { - state = self.state.load(Ordering::Relaxed); + state = self.state.load(Ordering::Acquire); continue; }