Struct fedimint_core::task::RwLockWriteGuard
source · pub struct RwLockWriteGuard<'a, T>where
T: ?Sized,{ /* private fields */ }Expand description
Implementations§
source§impl<'a, T> RwLockWriteGuard<'a, T>where
T: ?Sized,
impl<'a, T> RwLockWriteGuard<'a, T>where
T: ?Sized,
sourcepub fn map<F, U>(
this: RwLockWriteGuard<'a, T>,
f: F
) -> RwLockMappedWriteGuard<'a, U>
pub fn map<F, U>( this: RwLockWriteGuard<'a, T>, f: F ) -> RwLockMappedWriteGuard<'a, U>
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);sourcepub fn downgrade_map<F, U>(
this: RwLockWriteGuard<'a, T>,
f: F
) -> RwLockReadGuard<'a, U>
pub fn downgrade_map<F, U>( this: RwLockWriteGuard<'a, T>, f: F ) -> RwLockReadGuard<'a, U>
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);sourcepub fn try_map<F, U>(
this: RwLockWriteGuard<'a, T>,
f: F
) -> Result<RwLockMappedWriteGuard<'a, U>, RwLockWriteGuard<'a, T>>
pub fn try_map<F, U>( this: RwLockWriteGuard<'a, T>, f: F ) -> Result<RwLockMappedWriteGuard<'a, U>, RwLockWriteGuard<'a, T>>
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);sourcepub fn try_downgrade_map<F, U>(
this: RwLockWriteGuard<'a, T>,
f: F
) -> Result<RwLockReadGuard<'a, U>, RwLockWriteGuard<'a, T>>
pub fn try_downgrade_map<F, U>( this: RwLockWriteGuard<'a, T>, f: F ) -> Result<RwLockReadGuard<'a, U>, RwLockWriteGuard<'a, T>>
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);sourcepub fn into_mapped(
this: RwLockWriteGuard<'a, T>
) -> RwLockMappedWriteGuard<'a, T>
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).
sourcepub fn downgrade(self) -> RwLockReadGuard<'a, T>
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§
source§impl<'a, T> Debug for RwLockWriteGuard<'a, T>
impl<'a, T> Debug for RwLockWriteGuard<'a, T>
source§impl<T> Deref for RwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T> Deref for RwLockWriteGuard<'_, T>where
T: ?Sized,
source§impl<T> DerefMut for RwLockWriteGuard<'_, T>where
T: ?Sized,
impl<T> DerefMut for RwLockWriteGuard<'_, T>where
T: ?Sized,
source§impl<'a, T> Display for RwLockWriteGuard<'a, T>
impl<'a, T> Display for RwLockWriteGuard<'a, T>
source§impl<'a, T> Drop for RwLockWriteGuard<'a, T>where
T: ?Sized,
impl<'a, T> Drop for RwLockWriteGuard<'a, T>where
T: ?Sized,
impl<T> Send for RwLockWriteGuard<'_, T>
impl<T> Sync for RwLockWriteGuard<'_, T>
Auto Trait Implementations§
impl<'a, T> !RefUnwindSafe for RwLockWriteGuard<'a, T>
impl<'a, T: ?Sized> Unpin for RwLockWriteGuard<'a, T>
impl<'a, T> !UnwindSafe for RwLockWriteGuard<'a, T>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.source§impl<S, T> ScoreLookUp for Twhere
S: ScoreLookUp,
T: Deref<Target = S>,
impl<S, T> ScoreLookUp for Twhere
S: ScoreLookUp,
T: Deref<Target = S>,
§type ScoreParams = <S as ScoreLookUp>::ScoreParams
type ScoreParams = <S as ScoreLookUp>::ScoreParams
source§fn channel_penalty_msat(
&self,
short_channel_id: u64,
source: &NodeId,
target: &NodeId,
usage: ChannelUsage,
score_params: &<T as ScoreLookUp>::ScoreParams
) -> u64
fn channel_penalty_msat( &self, short_channel_id: u64, source: &NodeId, target: &NodeId, usage: ChannelUsage, score_params: &<T as ScoreLookUp>::ScoreParams ) -> u64
send_amt_msat through the
given channel in the direction from source to target. Read moresource§impl<S, T> ScoreUpdate for Twhere
S: ScoreUpdate,
T: DerefMut<Target = S>,
impl<S, T> ScoreUpdate for Twhere
S: ScoreUpdate,
T: DerefMut<Target = S>,
source§fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64)
fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64)
source§fn payment_path_successful(&mut self, path: &Path)
fn payment_path_successful(&mut self, path: &Path)
source§fn probe_failed(&mut self, path: &Path, short_channel_id: u64)
fn probe_failed(&mut self, path: &Path, short_channel_id: u64)
source§fn probe_successful(&mut self, path: &Path)
fn probe_successful(&mut self, path: &Path)
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.