Mutex

Struct Mutex 

Source
pub struct Mutex<T: ?Sized>(/* private fields */);
Expand description

Custom synchronization primitive for managing shared mutable state.

This custom mutex implementation builds on std::sync::Mutex to enhance usability and safety in concurrent environments. It provides ergonomic methods to safely access and modify inner values while reducing the risk of deadlocks and panics. It is used throughout SRI applications to managed shared state across multiple threads, such as tracking active mining sessions, routing jobs, and managing connections safely and efficiently.

§Advantages

  • Closure-Based Locking: The safe_lock method encapsulates the locking process, ensuring the lock is automatically released after the closure completes.
  • Error Handling: safe_lock enforces explicit handling of potential PoisonError conditions, reducing the risk of panics caused by poisoned locks.
  • Panic-Safe Option: The super_safe_lock method provides an alternative that unwraps the result of safe_lock, with optional runtime safeguards against panics.
  • Extensibility: Includes feature-gated functionality to customize behavior, such as stricter runtime checks using external tools like no-panic.

Implementations§

Source§

impl<T> Mutex<T>

Source

pub fn safe_lock<F, Ret>( &self, thunk: F, ) -> Result<Ret, PoisonError<MutexGuard<'_, T>>>
where F: FnOnce(&mut T) -> Ret,

Mutex safe lock.

Safely locks the Mutex and executes a closer (thunk) with a mutable reference to the inner value. This ensures that the lock is automatically released after the closure completes, preventing deadlocks. It explicitly returns a PoisonError containing a MutexGuard to the inner value in cases where the lock is poisoned.

To prevent poison lock errors, unwraps should never be used within the closure. The result should always be returned and handled outside of the sage lock.

Source

pub fn super_safe_lock<F, Ret>(&self, thunk: F) -> Ret
where F: FnOnce(&mut T) -> Ret,

Mutex super safe lock.

Locks the Mutex and executes a closure (thunk) with a mutable reference to the inner value, panicking if the lock is poisoned.

This is a convenience wrapper around safe_lock for cases where explicit error handling is unnecessary or undesirable. Use with caution in production code.

Source

pub fn new(v: T) -> Self

Creates a new Mutex instance, storing the initial value inside.

Source

pub fn to_remove( &self, ) -> Result<MutexGuard<'_, T>, PoisonError<MutexGuard<'_, T>>>

Removes lock for direct access.

Acquires a lock on the Mutex and returns a MutexGuard for direct access to the inner value. Allows for manual lock handling and is useful in scenarios where closures are not convenient.

Trait Implementations§

Source§

impl<T: Debug + ?Sized> Debug for Mutex<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for Mutex<T>

§

impl<T> RefUnwindSafe for Mutex<T>
where T: ?Sized,

§

impl<T> Send for Mutex<T>
where T: Send + ?Sized,

§

impl<T> Sync for Mutex<T>
where T: Send + ?Sized,

§

impl<T> Unpin for Mutex<T>
where T: Unpin + ?Sized,

§

impl<T> UnwindSafe for Mutex<T>
where T: ?Sized,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more