X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fsync%2Ftest_lockorder_checks.rs;h=96e497d44392985cd33b31f873751b0cc030f1d6;hb=e4b6a5004edb566fda341e1710950ff2b3fe241e;hp=f9f30e2cfa28efb4d42960d3fb4c1afc713b8933;hpb=230331f3e8efe9cee0ad2dc1644051bd9679a01f;p=rust-lightning diff --git a/lightning/src/sync/test_lockorder_checks.rs b/lightning/src/sync/test_lockorder_checks.rs index f9f30e2c..96e497d4 100644 --- a/lightning/src/sync/test_lockorder_checks.rs +++ b/lightning/src/sync/test_lockorder_checks.rs @@ -1,5 +1,9 @@ use crate::sync::debug_sync::{RwLock, Mutex}; +use super::{LockHeldState, LockTestExt}; + +use std::sync::Arc; + #[test] #[should_panic] #[cfg(not(feature = "backtrace"))] @@ -10,6 +14,8 @@ fn recursive_lock_fail() { } #[test] +#[should_panic] +#[cfg(not(feature = "backtrace"))] fn recursive_read() { let lock = RwLock::new(()); let _a = lock.read().unwrap(); @@ -61,23 +67,6 @@ fn read_lockorder_fail() { } } -#[test] -fn read_recursive_no_lockorder() { - // Like the above, but note that no lockorder is implied when we recursively read-lock a - // RwLock, causing this to pass just fine. - let a = RwLock::new(()); - let b = RwLock::new(()); - let _outer = a.read().unwrap(); - { - let _a = a.read().unwrap(); - let _b = b.read().unwrap(); - } - { - let _b = b.read().unwrap(); - let _a = a.read().unwrap(); - } -} - #[test] #[should_panic] fn read_write_lockorder_fail() { @@ -92,3 +81,22 @@ fn read_write_lockorder_fail() { let _a = a.write().unwrap(); } } + +#[test] +fn test_thread_locked_state() { + let mtx = Arc::new(Mutex::new(())); + let mtx_ref = Arc::clone(&mtx); + assert_eq!(mtx.held_by_thread(), LockHeldState::NotHeldByThread); + + let lck = mtx.lock().unwrap(); + assert_eq!(mtx.held_by_thread(), LockHeldState::HeldByThread); + + let thrd = std::thread::spawn(move || { + assert_eq!(mtx_ref.held_by_thread(), LockHeldState::NotHeldByThread); + }); + thrd.join().unwrap(); + assert_eq!(mtx.held_by_thread(), LockHeldState::HeldByThread); + + std::mem::drop(lck); + assert_eq!(mtx.held_by_thread(), LockHeldState::NotHeldByThread); +}