| 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(); |
| } |