• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use super::{ReentrantMutex, ReentrantMutexGuard};
2 use crate::cell::RefCell;
3 use crate::sync::Arc;
4 use crate::thread;
5 
6 #[test]
smoke()7 fn 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()24 fn 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()41 fn 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