X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fsync%2Ftest_lockorder_checks.rs;h=6d72410bd596341fd5246760f03046884b93e3b5;hb=a9e6341f79af07aa9870d88e3887912fa2114e39;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..6d72410b 100644 --- a/lightning/src/sync/test_lockorder_checks.rs +++ b/lightning/src/sync/test_lockorder_checks.rs @@ -1,5 +1,10 @@ use crate::sync::debug_sync::{RwLock, Mutex}; +use super::{LockHeldState, LockTestExt}; + +use std::sync::Arc; +use std::thread; + #[test] #[should_panic] #[cfg(not(feature = "backtrace"))] @@ -10,6 +15,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 +68,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 +82,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); +}