1 use crate::sync::debug_sync::{RwLock, Mutex};
3 use super::{LockHeldState, LockTestExt};
10 #[cfg(not(feature = "backtrace"))]
11 fn recursive_lock_fail() {
12 let mutex = Mutex::new(());
13 let _a = mutex.lock().unwrap();
14 let _b = mutex.lock().unwrap();
19 #[cfg(not(feature = "backtrace"))]
21 let lock = RwLock::new(());
22 let _a = lock.read().unwrap();
23 let _b = lock.read().unwrap();
29 let a = Mutex::new(());
30 let b = Mutex::new(());
32 let _a = a.lock().unwrap();
33 let _b = b.lock().unwrap();
36 let _b = b.lock().unwrap();
37 let _a = a.lock().unwrap();
43 fn write_lockorder_fail() {
44 let a = RwLock::new(());
45 let b = RwLock::new(());
47 let _a = a.write().unwrap();
48 let _b = b.write().unwrap();
51 let _b = b.write().unwrap();
52 let _a = a.write().unwrap();
58 fn read_lockorder_fail() {
59 let a = RwLock::new(());
60 let b = RwLock::new(());
62 let _a = a.read().unwrap();
63 let _b = b.read().unwrap();
66 let _b = b.read().unwrap();
67 let _a = a.read().unwrap();
73 fn read_write_lockorder_fail() {
74 let a = RwLock::new(());
75 let b = RwLock::new(());
77 let _a = a.write().unwrap();
78 let _b = b.read().unwrap();
81 let _b = b.read().unwrap();
82 let _a = a.write().unwrap();
87 fn test_thread_locked_state() {
88 let mtx = Arc::new(Mutex::new(()));
89 let mtx_ref = Arc::clone(&mtx);
90 assert_eq!(mtx.held_by_thread(), LockHeldState::NotHeldByThread);
92 let lck = mtx.lock().unwrap();
93 assert_eq!(mtx.held_by_thread(), LockHeldState::HeldByThread);
95 let thrd = std::thread::spawn(move || {
96 assert_eq!(mtx_ref.held_by_thread(), LockHeldState::NotHeldByThread);
99 assert_eq!(mtx.held_by_thread(), LockHeldState::HeldByThread);
102 assert_eq!(mtx.held_by_thread(), LockHeldState::NotHeldByThread);