about summary refs log tree commit diff
diff options
context:
space:
mode:
authorConnor Tsui <87130162+connortsui20@users.noreply.github.com>2024-11-16 12:22:35 -0500
committerConnor Tsui <connor.tsui20@gmail.com>2024-11-16 12:31:14 -0500
commit782b07e1ff4a4f8ecf00d5e030dfead9222d2185 (patch)
tree5f022bdfab0f4130f006356e8258296648e9fca8
parent84fd95cbedf1e1c1826e378ffc4d1a3d335deff4 (diff)
downloadrust-782b07e1ff4a4f8ecf00d5e030dfead9222d2185.tar.gz
rust-782b07e1ff4a4f8ecf00d5e030dfead9222d2185.zip
fix `DOWNGRADED` bit unpreserved
Co-authored-by: Jonas Böttiger <jonasboettiger@icloud.com>
-rw-r--r--library/std/src/sync/rwlock/tests.rs2
-rw-r--r--library/std/src/sys/sync/rwlock/queue.rs4
2 files changed, 3 insertions, 3 deletions
diff --git a/library/std/src/sync/rwlock/tests.rs b/library/std/src/sync/rwlock/tests.rs
index 4f30ef3cac3..5413a062cef 100644
--- a/library/std/src/sync/rwlock/tests.rs
+++ b/library/std/src/sync/rwlock/tests.rs
@@ -558,7 +558,7 @@ fn test_downgrade_atomic() {
     // modify the protected value.
 
     // `W` is the number of evil writer threads.
-    const W: usize = if cfg!(target_pointer_width = "64") { 100 } else { 20 };
+    const W: usize = 20;
     let rwlock = Arc::new(RwLock::new(0));
 
     // Spawns many evil writer threads that will try and write to the locked value before the
diff --git a/library/std/src/sys/sync/rwlock/queue.rs b/library/std/src/sys/sync/rwlock/queue.rs
index c654fca0d6e..51330f8fafe 100644
--- a/library/std/src/sys/sync/rwlock/queue.rs
+++ b/library/std/src/sys/sync/rwlock/queue.rs
@@ -395,9 +395,9 @@ impl RwLock {
             node.next.0 = AtomicPtr::new(state.mask(NODE_MASK).cast());
             node.prev = AtomicLink::new(None);
 
-            // Set the `QUEUED` bit and maintain the `LOCKED` bit.
+            // Set the `QUEUED` bit and preserve the `LOCKED` and `DOWNGRADED` bit.
             let mut next = ptr::from_ref(&node)
-                .map_addr(|addr| addr | QUEUED | (state.addr() & LOCKED))
+                .map_addr(|addr| addr | QUEUED | (state.addr() & (DOWNGRADED | LOCKED)))
                 as State;
 
             let mut is_queue_locked = false;