summaryrefslogtreecommitdiffstats
path: root/tokio/src/sync/tests/loom_rwlock.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tokio/src/sync/tests/loom_rwlock.rs')
-rw-r--r--tokio/src/sync/tests/loom_rwlock.rs25
1 files changed, 23 insertions, 2 deletions
diff --git a/tokio/src/sync/tests/loom_rwlock.rs b/tokio/src/sync/tests/loom_rwlock.rs
index 48d06e1d..2834a263 100644
--- a/tokio/src/sync/tests/loom_rwlock.rs
+++ b/tokio/src/sync/tests/loom_rwlock.rs
@@ -6,7 +6,7 @@ use std::sync::Arc;
#[test]
fn concurrent_write() {
- let mut b = loom::model::Builder::new();
+ let b = loom::model::Builder::new();
b.check(|| {
let rwlock = Arc::new(RwLock::<u32>::new(0));
@@ -37,7 +37,7 @@ fn concurrent_write() {
#[test]
fn concurrent_read_write() {
- let mut b = loom::model::Builder::new();
+ let b = loom::model::Builder::new();
b.check(|| {
let rwlock = Arc::new(RwLock::<u32>::new(0));
@@ -76,3 +76,24 @@ fn concurrent_read_write() {
assert_eq!(10, *guard);
});
}
+#[test]
+fn downgrade() {
+ loom::model(|| {
+ let lock = Arc::new(RwLock::new(1));
+
+ let n = block_on(lock.write());
+
+ let cloned_lock = lock.clone();
+ let handle = thread::spawn(move || {
+ let mut guard = block_on(cloned_lock.write());
+ *guard = 2;
+ });
+
+ let n = n.downgrade();
+ assert_eq!(*n, 1);
+
+ drop(n);
+ handle.join().unwrap();
+ assert_eq!(*block_on(lock.read()), 2);
+ });
+}