Sfoglia il codice sorgente

rwlock: fix lost wakeup problem

greatbridf 10 mesi fa
parent
commit
df68448e87
2 ha cambiato i file con 4 aggiunte e 6 eliminazioni
  1. 2 2
      crates/eonix_sync/src/rwlock.rs
  2. 2 4
      src/sync.rs

+ 2 - 2
crates/eonix_sync/src/rwlock.rs

@@ -44,7 +44,7 @@ where
     ) -> <Self as LockStrategy>::GuardContext {
         loop {
             let mut counter = data.counter.load(Ordering::Relaxed);
-            while !W::has_write_waiting(&data.wait_data) && counter >= 0 {
+            while counter >= 0 {
                 match data.counter.compare_exchange_weak(
                     counter,
                     counter + 1,
@@ -57,7 +57,7 @@ where
             }
 
             W::read_wait(&data.wait_data, || {
-                !W::has_write_waiting(&data.wait_data) && data.counter.load(Ordering::Relaxed) >= 0
+                data.counter.load(Ordering::Relaxed) >= 0
             });
         }
     }

+ 2 - 4
src/sync.rs

@@ -57,8 +57,7 @@ impl WaitStrategy for Wait {
         let _lock = data.lock.lock();
         if Self::has_write_waiting(data) {
             data.cv_write.notify_one();
-        }
-        if Self::has_read_waiting(data) {
+        } else if Self::has_read_waiting(data) {
             data.cv_read.notify_all();
         }
     }
@@ -67,8 +66,7 @@ impl WaitStrategy for Wait {
         let _lock = data.lock.lock();
         if Self::has_write_waiting(data) {
             data.cv_write.notify_one();
-        }
-        if Self::has_read_waiting(data) {
+        } else if Self::has_read_waiting(data) {
             data.cv_read.notify_all();
         }
     }