diff --git a/src/sync/rwlock.rs b/src/sync/rwlock.rs
index f5ecaf12fe601ecdfaf8d022b8ec1d6d21ae2394..b787a8e85747f9e531d574e422bbde90b927368b 100644
--- a/src/sync/rwlock.rs
+++ b/src/sync/rwlock.rs
@@ -45,7 +45,15 @@ impl Rwlock {
                     };
                     waiting_wr = expected & WAITING_WR;
 
-                    let _ = crate::sync::futex_wait(&self.state, expected, deadline);
+                    if actual & COUNT_MASK > 0 {
+                        let _ = crate::sync::futex_wait(&self.state, expected, deadline);
+                    } else {
+                        // We must avoid blocking indefinitely in our `futex_wait()`, in this case
+                        // where it's possible that `self.state == expected` but our futex might
+                        // never be woken again, because it's possible that all other threads
+                        // already did their `futex_wake()` before we would've done our
+                        // `futex_wait()`.
+                    }
                 }
             }
         }