summaryrefslogtreecommitdiff
path: root/tests/evil_rwlock.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/evil_rwlock.rs')
-rw-r--r--tests/evil_rwlock.rs26
1 files changed, 25 insertions, 1 deletions
diff --git a/tests/evil_rwlock.rs b/tests/evil_rwlock.rs
index a1cf0b3..234847c 100644
--- a/tests/evil_rwlock.rs
+++ b/tests/evil_rwlock.rs
@@ -1,6 +1,6 @@
use std::sync::Arc;
-use happylock::collection::BoxedLockCollection;
+use happylock::collection::{BoxedLockCollection, RetryingLockCollection};
use happylock::rwlock::RwLock;
use happylock::ThreadKey;
use lock_api::{GuardNoSend, RawRwLock};
@@ -64,3 +64,27 @@ fn boxed_rwlocks() {
assert!(evil_mutex.try_write(&mut key).is_err());
assert!(useless_mutex.try_write(&mut key).is_ok());
}
+
+#[test]
+fn retrying_rwlocks() {
+ let mut key = ThreadKey::get().unwrap();
+ let good_mutex: Arc<RwLock<i32, parking_lot::RawRwLock>> = Arc::new(RwLock::new(5));
+ let evil_mutex: Arc<RwLock<i32, EvilRwLock>> = Arc::new(RwLock::new(7));
+ let useless_mutex: Arc<RwLock<i32, parking_lot::RawRwLock>> = Arc::new(RwLock::new(10));
+ let c_good = Arc::clone(&good_mutex);
+ let c_evil = Arc::clone(&evil_mutex);
+ let c_useless = Arc::clone(&useless_mutex);
+
+ let r = std::thread::spawn(move || {
+ let mut key = ThreadKey::get().unwrap();
+ let collection =
+ RetryingLockCollection::try_new((&*c_good, &*c_evil, &*c_useless)).unwrap();
+ collection.lock(&mut key);
+ })
+ .join();
+
+ assert!(r.is_err());
+ assert!(good_mutex.try_write(&mut key).is_ok());
+ assert!(evil_mutex.try_write(&mut key).is_err());
+ assert!(useless_mutex.try_write(&mut key).is_ok());
+}