use std::cell::RefCell; use std::sync::{Arc, ReentrantLock}; use std::thread; #[test] fn smoke() { let l = ReentrantLock::new(()); { let a = l.lock(); { let b = l.lock(); { let c = l.lock(); assert_eq!(*c, ()); } assert_eq!(*b, ()); } assert_eq!(*a, ()); } } #[test] fn is_mutex() { let l = Arc::new(ReentrantLock::new(RefCell::new(0))); let l2 = l.clone(); let lock = l.lock(); let child = thread::spawn(move || { let lock = l2.lock(); assert_eq!(*lock.borrow(), 4950); }); for i in 0..100 { let lock = l.lock(); *lock.borrow_mut() += i; } drop(lock); child.join().unwrap(); } #[test] fn trylock_works() { let l = Arc::new(ReentrantLock::new(())); let l2 = l.clone(); let _lock = l.try_lock(); let _lock2 = l.try_lock(); thread::spawn(move || { let lock = l2.try_lock(); assert!(lock.is_none()); }) .join() .unwrap(); let _lock3 = l.try_lock(); }