Skip to main content

DynamicRcuLock

Struct DynamicRcuLock 

Source
pub struct DynamicRcuLock<T> { /* private fields */ }
Expand description

A synchronization wrapper that combines an RCU primitive T with a DynamicLockDepMutex to serialize updates while permitting lock-free RCU reads, without using types for lock levels.

Readers access the underlying RCU value without acquiring the mutex via the read methods on DynamicRcuLock. Writers must acquire the mutex via DynamicRcuLock::lock or DynamicRcuLock::try_lock to obtain an RcuLockGuard, which grants exclusive writer access to T.

Implementations§

Source§

impl<T> DynamicRcuLock<T>

Source

pub const fn new<L: LockLevel>(rcu: T) -> Self

Creates a new DynamicRcuLock wrapping rcu at lock level L.

Source

pub fn lock(&self) -> RcuLockGuard<'_, T>

Acquires the update lock and returns a guard that allows updating the RCU cell.

Source

pub fn try_lock(&self) -> Option<RcuLockGuard<'_, T>>

Attempts to acquire the update lock without blocking.

Source§

impl<T: Send + Sync + 'static> DynamicRcuLock<RcuArc<T>>

Source

pub fn upgrade(&self) -> Option<Arc<T>>

Reads the contents of the underlying RcuArc without acquiring the update lock.

Returns None if the wrapped Arc is None or is no longer valid.

Source

pub fn is_some(&self) -> bool

Returns true if the underlying RcuArc currently contains a value.

Source

pub fn is_none(&self) -> bool

Returns true if the underlying RcuArc does not contain a value.

Source§

impl<T: RcuDroppable + Sync> DynamicRcuLock<RcuArray<T>>

Source

pub fn get<'a>(&self, scope: &'a RcuReadScope, index: usize) -> Option<&'a T>

Returns a reference to the element at index, or None if index is out of bounds.

Source

pub fn as_slice<'a>(&self, scope: &'a RcuReadScope) -> &'a [T]

Returns a slice containing the entire array bound to scope.

Source§

impl<T: RcuDroppable + Sync> DynamicRcuLock<RcuBox<T>>

Source

pub fn read(&self) -> RcuReadGuard<T>

Reads the value of the wrapped RcuBox without acquiring the update lock.

Source

pub fn as_ref<'a>(&self, scope: &'a RcuReadScope) -> &'a T

Returns a reference to the value of the wrapped RcuBox bound to scope.

Source

pub fn cloned(&self) -> T
where T: Clone,

Returns a clone of the value of the wrapped RcuBox.

Source§

impl<T: RcuDroppable + Sync> DynamicRcuLock<RcuDroppableArc<T>>

Source

pub fn read(&self) -> RcuReadGuard<T>

Reads the value of the wrapped RcuDroppableArc without acquiring the update lock.

Source

pub fn as_ref<'a>(&self, scope: &'a RcuReadScope) -> &'a T

Returns a reference to the value of the wrapped RcuDroppableArc bound to scope.

Source

pub fn to_arc(&self) -> Arc<T> ⓘ

Creates a new Arc<T> referencing the same object as the underlying RcuDroppableArc.

Source§

impl<T: RcuDroppable + Sync> DynamicRcuLock<RcuOptionArc<T>>

Source

pub fn read(&self) -> Option<RcuReadGuard<T>>

Reads the value of the wrapped RcuOptionArc without acquiring the update lock.

Source

pub fn as_ref<'a>(&self, scope: &'a RcuReadScope) -> Option<&'a T>

Returns a reference to the value of the wrapped RcuOptionArc bound to scope.

Source

pub fn to_option_arc(&self) -> Option<Arc<T>>

Creates a new Option<Arc<T>> referencing the same object as the underlying RcuOptionArc.

Source§

impl<T: RcuDroppable + Sync> DynamicRcuLock<RcuOptionBox<T>>

Source

pub fn read(&self) -> Option<RcuReadGuard<T>>

Reads the value of the wrapped RcuOptionBox without acquiring the update lock.

Source

pub fn as_ref<'a>(&self, scope: &'a RcuReadScope) -> Option<&'a T>

Returns a reference to the value of the wrapped RcuOptionBox bound to scope.

Source

pub fn is_some(&self, scope: &RcuReadScope) -> bool

Returns true if the underlying RcuOptionBox currently contains a value.

Source

pub fn is_none(&self, scope: &RcuReadScope) -> bool

Returns true if the underlying RcuOptionBox does not contain a value.

Source

pub fn cloned(&self) -> Option<T>
where T: Clone,

Returns a clone of the value of the wrapped RcuOptionBox.

Source§

impl<T: Send + Sync + 'static> DynamicRcuLock<RcuWeak<T>>

Source

pub fn upgrade(&self) -> Option<Arc<T>>

Attempts to upgrade the wrapped Weak pointer to an Arc without acquiring the update lock.

Source

pub fn to_weak(&self) -> Weak<T>

Creates a new Weak pointer to the object referenced by the underlying RcuWeak.

Source

pub fn ptr_eq(&self, other: &Weak<T>) -> bool

Returns true if the wrapped weak pointer points to the same allocation as other.

Source

pub fn strong_count(&self, scope: &RcuReadScope) -> usize

Returns the number of strong (Arc) pointers pointing to the allocation.

Trait Implementations§

Source§

impl<T: Debug> Debug for DynamicRcuLock<T>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<T> MutexLike for DynamicRcuLock<T>

Source§

type Guard<'a> = RcuLockGuard<'a, T> where T: 'a

Source§

type Context = <DynamicLockDepMutex<()> as MutexLike>::Context

Source§

fn context() -> Self::Context

Source§

fn lock(&self, context: &mut Self::Context) -> Self::Guard<'_>

Lock the mutex. level is the index of the locked mutex in the lock ordering.
Source§

fn key(&self) -> *const ()
where Self: Sized,

Source§

impl<T> RcuDroppable for DynamicRcuLock<T>

Source§

impl<T> ResetDependencies for DynamicRcuLock<T>

Source§

unsafe fn reset_dependencies(&self)

Resets the lock dependency graph for this lock. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for DynamicRcuLock<T>

§

impl<T> !RefUnwindSafe for DynamicRcuLock<T>

§

impl<T> Send for DynamicRcuLock<T>
where T: Send,

§

impl<T> Sync for DynamicRcuLock<T>
where T: Sync,

§

impl<T> Unpin for DynamicRcuLock<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for DynamicRcuLock<T>
where T: UnsafeUnpin,

§

impl<T> UnwindSafe for DynamicRcuLock<T>
where T: UnwindSafe,

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T, D> Encode<Ambiguous1, D> for T
where D: ResourceDialect,

§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
§

impl<T, D> Encode<Ambiguous2, D> for T
where D: ResourceDialect,

§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
§

impl<F, N> FidlIntoNative<Box<N>> for F
where F: FidlIntoNative<N>,

§

fn fidl_into_native(self) -> Box<N>

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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 = !

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

fn try_from(value: U) -> Result<T, !>

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.