timed-locks 0.1.1

Smart pointers to `tokio::sync` locks that either panic or error after a timeout.
Documentation
use std::{collections::HashSet, sync::Arc, time::Duration};

use timed_locks::{Mutex, RwLock};

#[tokio::test(start_paused = true)]
#[should_panic]
async fn rwlock_read_deadlock_panic() {
	let lock = Arc::new(RwLock::new(HashSet::<usize>::new()));
	let read_lock = lock.clone();
	let _write_lock = (*lock).write().await;

	read_lock.read().await;
}

#[tokio::test(start_paused = true)]
#[should_panic]
async fn rwlock_read_deadlock_panic_custom_timeout() {
	let lock = Arc::new(RwLock::new_with_timeout(HashSet::<usize>::new(), Duration::from_secs(60)));
	let read_lock = lock.clone();
	let _write_lock = (*lock).write().await;

	read_lock.read().await;
}

#[tokio::test(start_paused = true)]
#[should_panic]
async fn rwlock_write_deadlock_panic() {
	let lock = Arc::new(RwLock::new(HashSet::<usize>::new()));
	let write_lock = lock.clone();
	let _read_lock = (*lock).read().await;

	write_lock.write().await;
}

#[tokio::test(start_paused = true)]
async fn rwlock_read_deadlock_error() {
	let lock = Arc::new(RwLock::new(HashSet::<usize>::new()));
	let read_lock = lock.clone();
	let _write_lock = (*lock).write().await;

	assert!(read_lock.read_err().await.is_err());
}

#[tokio::test(start_paused = true)]
async fn rwlock_write_deadlock_error() {
	let lock = Arc::new(RwLock::new(HashSet::<usize>::new()));
	let write_lock = lock.clone();
	let _read_lock = (*lock).read().await;

	assert!(write_lock.write_err().await.is_err());
}

#[tokio::test(start_paused = true)]
#[should_panic]
async fn mutex_deadlock_panic() {
	let mutex = Arc::new(Mutex::new(HashSet::<usize>::new()));
	let mutex = mutex.clone();
	let _guard = (*mutex).lock().await;

	mutex.lock().await;
}

#[tokio::test(start_paused = true)]
#[should_panic]
async fn mutex_deadlock_panic_custom_timeout() {
	let mutex = Arc::new(Mutex::new_with_timeout(HashSet::<usize>::new(), Duration::from_secs(60)));
	let mutex = mutex.clone();
	let _guard = (*mutex).lock().await;

	mutex.lock().await;
}

#[tokio::test(start_paused = true)]
async fn mutex_deadlock_error() {
	let mutex = Arc::new(Mutex::new(HashSet::<usize>::new()));
	let mutex = mutex.clone();
	let _guard = (*mutex).lock().await;

	assert!(mutex.lock_err().await.is_err());
}