atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: crates/matrix-sdk-common/src/locks.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
// Copyright 2025 The Matrix.org Foundation C.I.C.
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
// Licensed under the Apache License, Version 2.0 (the "License");
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
// you may not use this file except in compliance with the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
// You may obtain a copy of the License at
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
//     http://www.apache.org/licenses/LICENSE-2.0
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
// Unless required by applicable law or agreed to in writing, software
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
// distributed under the License is distributed on an "AS IS" BASIS,
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
// See the License for the specific language governing permissions and
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
// limitations under the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
//! Simplified locks hat panic instead of returning a `Result` when the lock is
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
//! poisoned.
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
use std::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
    fmt,
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
    sync::{Mutex as StdMutex, MutexGuard, RwLock as StdRwLock, RwLockReadGuard, RwLockWriteGuard},
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
};
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
use serde::{Deserialize, Serialize};
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
/// A wrapper around `std::sync::Mutex` that panics on poison.
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
/// This `Mutex` works similarly to the standard library's `Mutex`, except its
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
/// `lock` method does not return a `Result`. Instead, if the mutex is poisoned,
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
/// it will panic.
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
/// # Examples
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
/// ```
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
/// use matrix_sdk_common::locks::Mutex;
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
/// let mutex = Mutex::new(42);
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
/// {
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
///     let mut guard = mutex.lock();
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
///     *guard = 100;
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
/// }
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
/// assert_eq!(*mutex.lock(), 100);
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
/// ```
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
#[derive(Default)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
pub struct Mutex<T: ?Sized>(StdMutex<T>);
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
impl<T> Mutex<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
    /// Creates a new `Mutex` wrapping the given value.
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
    pub const fn new(t: T) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
        Self(StdMutex::new(t))
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
impl<T: ?Sized> Mutex<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
    /// Acquires the lock, panicking if the lock is poisoned.
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
    /// This method blocks the current thread until the lock is acquired.
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
    pub fn lock(&self) -> MutexGuard<'_, T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
        self.0.lock().expect("The Mutex should never be poisoned")
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
impl<T: ?Sized + fmt::Debug> fmt::Debug for Mutex<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
        self.0.fmt(f)
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
/// A wrapper around [`std::sync::RwLock`] that panics on poison.
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
/// This `RwLock` works similarly to the standard library's `RwLock`, except its
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
/// `read` and `write` methods do not return a `Result`. Instead, if the lock is
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
/// poisoned, it will panic.
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
/// # Examples
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
/// ```
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
/// use matrix_sdk_common::locks::RwLock;
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC81
/// let lock = RwLock::new(42);
7ff8adafe9e4atagen2026-10-22 12:30 UTC82
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC83
/// {
7ff8adafe9e4atagen2026-10-22 12:30 UTC84
///     let read_guard = lock.read();
7ff8adafe9e4atagen2026-10-22 12:30 UTC85
///     assert_eq!(*read_guard, 42);
7ff8adafe9e4atagen2026-10-22 12:30 UTC86
/// }
7ff8adafe9e4atagen2026-10-22 12:30 UTC87
/// {
7ff8adafe9e4atagen2026-10-22 12:30 UTC88
///     let mut write_guard = lock.write();
7ff8adafe9e4atagen2026-10-22 12:30 UTC89
///     *write_guard = 100;
7ff8adafe9e4atagen2026-10-22 12:30 UTC90
/// }
7ff8adafe9e4atagen2026-10-22 12:30 UTC91
/// assert_eq!(*lock.read(), 100);
7ff8adafe9e4atagen2026-10-22 12:30 UTC92
/// ```
7ff8adafe9e4atagen2026-10-22 12:30 UTC93
#[derive(Default, Serialize, Deserialize)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC94
#[serde(transparent)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC95
pub struct RwLock<T: ?Sized>(StdRwLock<T>);
7ff8adafe9e4atagen2026-10-22 12:30 UTC96
7ff8adafe9e4atagen2026-10-22 12:30 UTC97
impl<T> RwLock<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC98
    /// Creates a new `RwLock` wrapping the given value.
7ff8adafe9e4atagen2026-10-22 12:30 UTC99
    pub const fn new(t: T) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC100
        Self(StdRwLock::new(t))
7ff8adafe9e4atagen2026-10-22 12:30 UTC101
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC102
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC103
7ff8adafe9e4atagen2026-10-22 12:30 UTC104
impl<T: ?Sized> RwLock<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC105
    /// Acquires a mutable write lock, panicking if the lock is poisoned.
7ff8adafe9e4atagen2026-10-22 12:30 UTC106
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC107
    /// This method blocks the current thread until the lock is acquired.
7ff8adafe9e4atagen2026-10-22 12:30 UTC108
    pub fn write(&self) -> RwLockWriteGuard<'_, T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC109
        self.0.write().expect("The RwLock should never be poisoned")
7ff8adafe9e4atagen2026-10-22 12:30 UTC110
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC111
7ff8adafe9e4atagen2026-10-22 12:30 UTC112
    /// Acquires a shared read lock, panicking if the lock is poisoned.
7ff8adafe9e4atagen2026-10-22 12:30 UTC113
    ///
7ff8adafe9e4atagen2026-10-22 12:30 UTC114
    /// This method blocks the current thread until the lock is acquired.
7ff8adafe9e4atagen2026-10-22 12:30 UTC115
    pub fn read(&self) -> RwLockReadGuard<'_, T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC116
        self.0.read().expect("The RwLock should never be poisoned")
7ff8adafe9e4atagen2026-10-22 12:30 UTC117
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC118
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC119
7ff8adafe9e4atagen2026-10-22 12:30 UTC120
impl<T: ?Sized + fmt::Debug> fmt::Debug for RwLock<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC121
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
7ff8adafe9e4atagen2026-10-22 12:30 UTC122
        self.0.fmt(f)
7ff8adafe9e4atagen2026-10-22 12:30 UTC123
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC124
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC125
7ff8adafe9e4atagen2026-10-22 12:30 UTC126
impl<T> From<T> for RwLock<T> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC127
    fn from(value: T) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC128
        Self::new(value)
7ff8adafe9e4atagen2026-10-22 12:30 UTC129
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC130
}