]> git.lizzy.rs Git - rust.git/blob - library/std/src/sys_common/remutex/tests.rs
Rollup merge of #98530 - davidkna:known-bug-ref, r=Mark-Simulacrum
[rust.git] / library / std / src / sys_common / remutex / tests.rs
1 use crate::boxed::Box;
2 use crate::cell::RefCell;
3 use crate::pin::Pin;
4 use crate::sync::Arc;
5 use crate::sys_common::remutex::{ReentrantMutex, ReentrantMutexGuard};
6 use crate::thread;
7
8 #[test]
9 fn smoke() {
10     let m = unsafe {
11         let mut m = Box::pin(ReentrantMutex::new(()));
12         m.as_mut().init();
13         m
14     };
15     let m = m.as_ref();
16     {
17         let a = m.lock();
18         {
19             let b = m.lock();
20             {
21                 let c = m.lock();
22                 assert_eq!(*c, ());
23             }
24             assert_eq!(*b, ());
25         }
26         assert_eq!(*a, ());
27     }
28 }
29
30 #[test]
31 fn is_mutex() {
32     let m = unsafe {
33         // FIXME: Simplify this if Arc gets an Arc::get_pin_mut.
34         let mut m = Arc::new(ReentrantMutex::new(RefCell::new(0)));
35         Pin::new_unchecked(Arc::get_mut_unchecked(&mut m)).init();
36         Pin::new_unchecked(m)
37     };
38     let m2 = m.clone();
39     let lock = m.as_ref().lock();
40     let child = thread::spawn(move || {
41         let lock = m2.as_ref().lock();
42         assert_eq!(*lock.borrow(), 4950);
43     });
44     for i in 0..100 {
45         let lock = m.as_ref().lock();
46         *lock.borrow_mut() += i;
47     }
48     drop(lock);
49     child.join().unwrap();
50 }
51
52 #[test]
53 fn trylock_works() {
54     let m = unsafe {
55         // FIXME: Simplify this if Arc gets an Arc::get_pin_mut.
56         let mut m = Arc::new(ReentrantMutex::new(()));
57         Pin::new_unchecked(Arc::get_mut_unchecked(&mut m)).init();
58         Pin::new_unchecked(m)
59     };
60     let m2 = m.clone();
61     let _lock = m.as_ref().try_lock();
62     let _lock2 = m.as_ref().try_lock();
63     thread::spawn(move || {
64         let lock = m2.as_ref().try_lock();
65         assert!(lock.is_none());
66     })
67     .join()
68     .unwrap();
69     let _lock3 = m.as_ref().try_lock();
70 }
71
72 pub struct Answer<'a>(pub ReentrantMutexGuard<'a, RefCell<u32>>);
73 impl Drop for Answer<'_> {
74     fn drop(&mut self) {
75         *self.0.borrow_mut() = 42;
76     }
77 }