1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- use std::sync::Arc;
- use tokio::sync::{Mutex, MutexGuard};
- use tokio::time::{timeout, Duration};
- pub struct Shared<T> {
- pub data: Arc<Mutex<T>>,
-
- pub lock_timeout: u64,
- }
- impl<T> Clone for Shared<T> {
- fn clone(&self) -> Self {
- Self {
- data: self.data.clone(),
- lock_timeout: self.lock_timeout,
- }
- }
- }
- impl<T> Shared<T> {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- pub fn new(data: T) -> Self {
- Shared {
- data: Arc::new(Mutex::new(data)),
- lock_timeout: 30_u64,
- }
- }
-
- pub fn with_timeout(data: T, timeout: u64) -> Self {
- Shared { data: Arc::new(Mutex::new(data)), lock_timeout: timeout }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- pub async fn lock(&self) -> MutexGuard<'_, T> {
- let result = timeout(Duration::from_secs(self.lock_timeout), self.data.lock()).await;
- if let Ok(guard) = result {
- return guard;
- }
- panic!(
- "Failed to acquire lock in {} seconds. Deadlock?",
- self.lock_timeout
- );
-
- }
- }
|