2025-01-17 11:04:40 +00:00
|
|
|
use std::cell::RefCell;
|
|
|
|
use std::sync::{Arc, ReentrantLock};
|
|
|
|
use std::thread;
|
2020-08-27 13:45:01 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn smoke() {
|
2023-03-28 10:10:53 +00:00
|
|
|
let l = ReentrantLock::new(());
|
2020-08-27 13:45:01 +00:00
|
|
|
{
|
2023-03-28 10:10:53 +00:00
|
|
|
let a = l.lock();
|
2020-08-27 13:45:01 +00:00
|
|
|
{
|
2023-03-28 10:10:53 +00:00
|
|
|
let b = l.lock();
|
2020-08-27 13:45:01 +00:00
|
|
|
{
|
2023-03-28 10:10:53 +00:00
|
|
|
let c = l.lock();
|
2020-08-27 13:45:01 +00:00
|
|
|
assert_eq!(*c, ());
|
|
|
|
}
|
|
|
|
assert_eq!(*b, ());
|
|
|
|
}
|
|
|
|
assert_eq!(*a, ());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn is_mutex() {
|
2023-03-28 10:10:53 +00:00
|
|
|
let l = Arc::new(ReentrantLock::new(RefCell::new(0)));
|
|
|
|
let l2 = l.clone();
|
|
|
|
let lock = l.lock();
|
2020-08-27 13:45:01 +00:00
|
|
|
let child = thread::spawn(move || {
|
2023-03-28 10:10:53 +00:00
|
|
|
let lock = l2.lock();
|
2020-08-27 13:45:01 +00:00
|
|
|
assert_eq!(*lock.borrow(), 4950);
|
|
|
|
});
|
|
|
|
for i in 0..100 {
|
2023-03-28 10:10:53 +00:00
|
|
|
let lock = l.lock();
|
2020-08-27 13:45:01 +00:00
|
|
|
*lock.borrow_mut() += i;
|
|
|
|
}
|
|
|
|
drop(lock);
|
|
|
|
child.join().unwrap();
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn trylock_works() {
|
2023-03-28 10:10:53 +00:00
|
|
|
let l = Arc::new(ReentrantLock::new(()));
|
|
|
|
let l2 = l.clone();
|
|
|
|
let _lock = l.try_lock();
|
|
|
|
let _lock2 = l.try_lock();
|
2020-08-27 13:45:01 +00:00
|
|
|
thread::spawn(move || {
|
2023-03-28 10:10:53 +00:00
|
|
|
let lock = l2.try_lock();
|
2020-08-27 13:45:01 +00:00
|
|
|
assert!(lock.is_none());
|
|
|
|
})
|
|
|
|
.join()
|
|
|
|
.unwrap();
|
2023-03-28 10:10:53 +00:00
|
|
|
let _lock3 = l.try_lock();
|
2020-08-27 13:45:01 +00:00
|
|
|
}
|