pub struct PhantomMutex;Expand description
A zero-sized raw mutex marker that does not perform physical locking.
PhantomMutex can be used as the raw lock type in a KMutex<Class, PhantomMutex> field
to serve as a zero-sized “phantom” lock in structs where physical synchronization is managed
by an external shared lock (such as a ref-counted PeerHolder for peered dispatchers).
Using KMutex<Class, PhantomMutex> allows structs to integrate with #[guarded] and
#[guarded_by(...)] without allocating memory for a physical mutex in every instance.
Because PhantomMutex has no physical state of its own, associating a PhantomMutex-guarded
struct with a physical mutex (lock_<mu>) or lock token (guard_<mu> / guard_<mu>_mut) is
unsafe and requires the caller to uphold that the provided mutex or token is the specific
lock instance protecting that struct.
§Example
use ksync::{KCell, KMutex, PhantomMutex, guarded};
#[guarded]
struct RealObject {
#[mutex]
mu: KMutex,
}
#[guarded]
struct PeeredObject {
#[mutex(RealObjectMuClass)]
mu: KMutex<PhantomMutex>,
#[guarded_by(mu)]
value: KCell<i32>,
}
// When locking the shared physical mutex (`real_obj.mu`), call `lock_mu` in an `unsafe`
// block (asserting that `real_obj.mu` is the lock protecting `phantom_obj`):
ksync::lock!(let guard = unsafe { phantom_obj.lock_mu(&real_obj.mu) });
let value = guard.value();
// If already holding a lock token from another guard of the same class, call `guard_mu`
// in an `unsafe` block to obtain an accessor object without re-locking:
let other_value = unsafe { other_phantom_obj.guard_mu(guard.token()) }.value();Implementations§
Source§impl PhantomMutex
impl PhantomMutex
Trait Implementations§
Source§impl Clone for PhantomMutex
impl Clone for PhantomMutex
impl Copy for PhantomMutex
Source§impl Debug for PhantomMutex
impl Debug for PhantomMutex
Source§impl Default for PhantomMutex
impl Default for PhantomMutex
Source§impl HasPinData for PhantomMutex
impl HasPinData for PhantomMutex
Auto Trait Implementations§
impl Freeze for PhantomMutex
impl RefUnwindSafe for PhantomMutex
impl Send for PhantomMutex
impl Sync for PhantomMutex
impl UnsafeUnpin for PhantomMutex
impl UnwindSafe for PhantomMutex
Blanket Implementations§
§impl<T> Any for Twhere
T: 'static + ?Sized,
impl<T> Any for Twhere
T: 'static + ?Sized,
§impl<T> Borrow<T> for Twhere
T: ?Sized,
impl<T> Borrow<T> for Twhere
T: ?Sized,
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§unsafe fn clone_to_uninit(&self, dest: *mut u8)
unsafe fn clone_to_uninit(&self, dest: *mut u8)
clone_to_uninit)§impl<T, U> Into<U> for Twhere
U: From<T>,
impl<T, U> Into<U> for Twhere
U: From<T>,
Source§impl<T> PinInit<T> for T
impl<T> PinInit<T> for T
Source§unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), !>
unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), !>
slot. Read moreSource§fn pin_chain<F>(self, f: F) -> ChainPinInit<Self, F, T, E>where
F: FnOnce(Pin<&mut T>) -> Result<(), E>,
fn pin_chain<F>(self, f: F) -> ChainPinInit<Self, F, T, E>where
F: FnOnce(Pin<&mut T>) -> Result<(), E>,
self then calls the function f with the initialized
value. Read more