Skip to main content

RwLockWriteGuard

Struct RwLockWriteGuard 

pub struct RwLockWriteGuard<'a, T>
where T: ?Sized,
{ pub(super) permits_acquired: u32, pub(super) s: &'a Semaphore, pub(super) data: *mut T, pub(super) marker: PhantomData<&'a mut T>, }
Expand description

RAII structure used to release the exclusive write access of a lock when dropped.

This structure is created by the write method on RwLock.

Fields§

§permits_acquired: u32§s: &'a Semaphore§data: *mut T§marker: PhantomData<&'a mut T>

Implementations§

§

impl<'a, T> RwLockWriteGuard<'a, T>
where T: ?Sized,

pub fn map<F, U>( this: RwLockWriteGuard<'a, T>, f: F, ) -> RwLockMappedWriteGuard<'a, U>
where F: FnOnce(&mut T) -> &mut U, U: ?Sized,

Makes a new RwLockMappedWriteGuard for a component of the locked data.

This operation cannot fail as the RwLockWriteGuard passed in already locked the data.

This is an associated function that needs to be used as RwLockWriteGuard::map(..). A method would interfere with methods of the same name on the contents of the locked data.

This is an asynchronous version of RwLockWriteGuard::map from the parking_lot crate.

§Examples
use tokio::sync::{RwLock, RwLockWriteGuard};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);

let lock = RwLock::new(Foo(1));

{
    let mut mapped = RwLockWriteGuard::map(lock.write().await, |f| &mut f.0);
    *mapped = 2;
}

assert_eq!(Foo(2), *lock.read().await);

pub fn downgrade_map<F, U>( this: RwLockWriteGuard<'a, T>, f: F, ) -> RwLockReadGuard<'a, U>
where F: FnOnce(&T) -> &U, U: ?Sized,

Makes a new RwLockReadGuard for a component of the locked data.

This operation cannot fail as the RwLockWriteGuard passed in already locked the data.

This is an associated function that needs to be used as RwLockWriteGuard::downgrade_map(..). A method would interfere with methods of the same name on the contents of the locked data.

This is equivalent to a combination of asynchronous RwLockWriteGuard::map and RwLockWriteGuard::downgrade from the parking_lot crate.

Inside of f, you retain exclusive access to the data, despite only being given a &T. Handing out a &mut T would result in unsoundness, as you could use interior mutability.

§Examples
use tokio::sync::{RwLock, RwLockWriteGuard};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);

let lock = RwLock::new(Foo(1));

let mapped = RwLockWriteGuard::downgrade_map(lock.write().await, |f| &f.0);
let foo = lock.read().await;
assert_eq!(foo.0, *mapped);

pub fn try_map<F, U>( this: RwLockWriteGuard<'a, T>, f: F, ) -> Result<RwLockMappedWriteGuard<'a, U>, RwLockWriteGuard<'a, T>>
where F: FnOnce(&mut T) -> Option<&mut U>, U: ?Sized,

Attempts to make a new RwLockMappedWriteGuard for a component of the locked data. The original guard is returned if the closure returns None.

This operation cannot fail as the RwLockWriteGuard passed in already locked the data.

This is an associated function that needs to be used as RwLockWriteGuard::try_map(...). A method would interfere with methods of the same name on the contents of the locked data.

This is an asynchronous version of RwLockWriteGuard::try_map from the parking_lot crate.

§Examples
use tokio::sync::{RwLock, RwLockWriteGuard};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);

let lock = RwLock::new(Foo(1));

{
    let guard = lock.write().await;
    let mut guard = RwLockWriteGuard::try_map(guard, |f| Some(&mut f.0)).expect("should not fail");
    *guard = 2;
}

assert_eq!(Foo(2), *lock.read().await);

pub fn try_downgrade_map<F, U>( this: RwLockWriteGuard<'a, T>, f: F, ) -> Result<RwLockReadGuard<'a, U>, RwLockWriteGuard<'a, T>>
where F: FnOnce(&T) -> Option<&U>, U: ?Sized,

Attempts to make a new RwLockReadGuard for a component of the locked data. The original guard is returned if the closure returns None.

This operation cannot fail as the RwLockWriteGuard passed in already locked the data.

This is an associated function that needs to be used as RwLockWriteGuard::try_downgrade_map(...). A method would interfere with methods of the same name on the contents of the locked data.

This is equivalent to a combination of asynchronous RwLockWriteGuard::try_map and RwLockWriteGuard::downgrade from the parking_lot crate.

Inside of f, you retain exclusive access to the data, despite only being given a &T. Handing out a &mut T would result in unsoundness, as you could use interior mutability.

If this function returns Err(...), the lock is never unlocked nor downgraded.

§Examples
use tokio::sync::{RwLock, RwLockWriteGuard};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Foo(u32);

let lock = RwLock::new(Foo(1));

let guard = RwLockWriteGuard::try_downgrade_map(lock.write().await, |f| Some(&f.0)).expect("should not fail");
let foo = lock.read().await;
assert_eq!(foo.0, *guard);

pub fn into_mapped( this: RwLockWriteGuard<'a, T>, ) -> RwLockMappedWriteGuard<'a, T>

Converts this RwLockWriteGuard into an RwLockMappedWriteGuard. This method can be used to store a non-mapped guard in a struct field that expects a mapped guard.

This is equivalent to calling RwLockWriteGuard::map(guard, |me| me).

pub fn downgrade(self) -> RwLockReadGuard<'a, T>

Atomically downgrades a write lock into a read lock without allowing any writers to take exclusive access of the lock in the meantime.

Note: This won’t necessarily allow any additional readers to acquire locks, since RwLock is fair and it is possible that a writer is next in line.

Returns an RAII guard which will drop this read access of the RwLock when dropped.

§Examples
let lock = Arc::new(RwLock::new(1));

let n = lock.write().await;

let cloned_lock = lock.clone();
let handle = tokio::spawn(async move {
    *cloned_lock.write().await = 2;
});

let n = n.downgrade();
assert_eq!(*n, 1, "downgrade is atomic");

drop(n);
handle.await.unwrap();
assert_eq!(*lock.read().await, 2, "second writer obtained write lock");

Trait Implementations§

§

impl<'a, T> Debug for RwLockWriteGuard<'a, T>
where T: Debug + ?Sized,

§

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

Formats the value using the given formatter. Read more
§

impl<T> DerefMut for RwLockWriteGuard<'_, T>
where T: ?Sized,

§

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

Mutably dereferences the value.
§

impl<'a, T> Display for RwLockWriteGuard<'a, T>
where T: Display + ?Sized,

§

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

Formats the value using the given formatter. Read more
§

impl<'a, T> Drop for RwLockWriteGuard<'a, T>
where T: ?Sized,

§

fn drop(&mut self)

Executes the destructor for this type. Read more
§

impl<T> Deref for RwLockWriteGuard<'_, T>
where T: ?Sized,

§

type Target = T

The resulting type after dereferencing.
§

fn deref(&self) -> &T

Dereferences the value.
§

impl<T> Send for RwLockWriteGuard<'_, T>
where T: Send + Sync + ?Sized,

§

impl<T> Sync for RwLockWriteGuard<'_, T>
where T: Send + Sync + ?Sized,

Auto Trait Implementations§

§

impl<'a, T> Freeze for RwLockWriteGuard<'a, T>
where T: ?Sized,

§

impl<'a, T> RefUnwindSafe for RwLockWriteGuard<'a, T>
where T: RefUnwindSafe + ?Sized,

§

impl<'a, T> Unpin for RwLockWriteGuard<'a, T>
where T: ?Sized,

§

impl<'a, T> !UnwindSafe for RwLockWriteGuard<'a, T>

Blanket Implementations§

§

impl<R> TryRngCore for R
where R: TryRng,

§

type Error = <R as TryRng>::Error

👎Deprecated since 0.10.0: use TryRng instead
Error type.
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<K, V, T> Expiry<K, V> for T
where T: Deref<Target = dyn Expiry<K, V> + Sync + Send>,

§

fn expire_after_create( &self, key: &K, value: &V, created_at: Instant, ) -> Option<Duration>

Specifies that the entry should be automatically removed from the cache once the duration has elapsed after the entry’s creation. This method is called for cache write methods such as insert and get_with but only when the key was not present in the cache. Read more
§

fn expire_after_read( &self, key: &K, value: &V, read_at: Instant, duration_until_expiry: Option<Duration>, last_modified_at: Instant, ) -> Option<Duration>

Specifies that the entry should be automatically removed from the cache once the duration has elapsed after its last read. This method is called for cache read methods such as get and get_with but only when the key is present in the cache. Read more
§

fn expire_after_update( &self, key: &K, value: &V, updated_at: Instant, duration_until_expiry: Option<Duration>, ) -> Option<Duration>

Specifies that the entry should be automatically removed from the cache once the duration has elapsed after the replacement of its value. This method is called for cache write methods such as insert but only when the key is already present in the cache. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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> 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> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
§

impl<R> Rng for R
where R: TryRng<Error = Infallible> + ?Sized,

§

fn next_u32(&mut self) -> u32

Return the next random u32.
§

fn next_u64(&mut self) -> u64

Return the next random u64.
§

fn fill_bytes(&mut self, dst: &mut [u8])

Fill dest with random data. Read more
§

impl<R> RngExt for R
where R: Rng + ?Sized,

§

fn random<T>(&mut self) -> T
where StandardUniform: Distribution<T>,

Return a random value via the StandardUniform distribution. Read more
§

fn random_iter<T>(self) -> Iter<StandardUniform, Self, T>
where Self: Sized, StandardUniform: Distribution<T>,

Return an iterator over random variates Read more
§

fn random_range<T, R>(&mut self, range: R) -> T
where T: SampleUniform, R: SampleRange<T>,

Generate a random value in the given range. Read more
§

fn random_bool(&mut self, p: f64) -> bool

Return a bool with a probability p of being true. Read more
§

fn random_ratio(&mut self, numerator: u32, denominator: u32) -> bool

Return a bool with a probability of numerator/denominator of being true. Read more
§

fn sample<T, D>(&mut self, distr: D) -> T
where D: Distribution<T>,

Sample a new value, using the given distribution. Read more
§

fn sample_iter<T, D>(self, distr: D) -> Iter<D, Self, T>
where D: Distribution<T>, Self: Sized,

Create an iterator that generates values using the given distribution. Read more
§

fn fill<T>(&mut self, dest: &mut [T])
where T: Fill,

Fill any type implementing [Fill] with random data Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

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.
§

impl<R> TryRng for R
where R: DerefMut, <R as Deref>::Target: TryRng,

§

type Error = <<R as Deref>::Target as TryRng>::Error

The type returned in the event of a RNG error. Read more
§

fn try_next_u32(&mut self) -> Result<u32, <R as TryRng>::Error>

Return the next random u32.
§

fn try_next_u64(&mut self) -> Result<u64, <R as TryRng>::Error>

Return the next random u64.
§

fn try_fill_bytes(&mut self, dst: &mut [u8]) -> Result<(), <R as TryRng>::Error>

Fill dst entirely with random data.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<R> CryptoRng for R
where R: TryCryptoRng<Error = Infallible> + ?Sized,

§

impl<R> RngCore for R
where R: Rng,

§

impl<R> TryCryptoRng for R
where R: DerefMut, <R as Deref>::Target: TryCryptoRng,