diff options
Diffstat (limited to 'tokio/src/sync/tests/loom_rwlock.rs')
-rw-r--r-- | tokio/src/sync/tests/loom_rwlock.rs | 25 |
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); + }); +} |