1 use super::{ReentrantMutex, ReentrantMutexGuard}; 2 use crate::cell::RefCell; 3 use crate::sync::Arc; 4 use crate::thread; 5 6 #[test] smoke()7fn smoke() { 8 let m = ReentrantMutex::new(()); 9 { 10 let a = m.lock(); 11 { 12 let b = m.lock(); 13 { 14 let c = m.lock(); 15 assert_eq!(*c, ()); 16 } 17 assert_eq!(*b, ()); 18 } 19 assert_eq!(*a, ()); 20 } 21 } 22 23 #[test] is_mutex()24fn is_mutex() { 25 let m = Arc::new(ReentrantMutex::new(RefCell::new(0))); 26 let m2 = m.clone(); 27 let lock = m.lock(); 28 let child = thread::spawn(move || { 29 let lock = m2.lock(); 30 assert_eq!(*lock.borrow(), 4950); 31 }); 32 for i in 0..100 { 33 let lock = m.lock(); 34 *lock.borrow_mut() += i; 35 } 36 drop(lock); 37 child.join().unwrap(); 38 } 39 40 #[test] trylock_works()41fn trylock_works() { 42 let m = Arc::new(ReentrantMutex::new(())); 43 let m2 = m.clone(); 44 let _lock = m.try_lock(); 45 let _lock2 = m.try_lock(); 46 thread::spawn(move || { 47 let lock = m2.try_lock(); 48 assert!(lock.is_none()); 49 }) 50 .join() 51 .unwrap(); 52 let _lock3 = m.try_lock(); 53 } 54 55 pub struct Answer<'a>(pub ReentrantMutexGuard<'a, RefCell<u32>>); 56 impl Drop for Answer<'_> { drop(&mut self)57 fn drop(&mut self) { 58 *self.0.borrow_mut() = 42; 59 } 60 } 61