pub struct RacyLock<T, F = fn() -> T> { /* private fields */ }Expand description
Thread-safe, non-blocking, lazily evaluated lock with the same interface
as std::sync::LazyLock.
Concurrent threads will race to set the value atomically, and memory allocated by losing threads will be dropped immediately after they fail to set the pointer.
The underlying implementation is based on once_cell::race::OnceBox which relies on
core::sync::atomic::AtomicPtr to ensure that the data race results in a single successful
write to the relevant pointer, namely the first write.
See https://github.com/matklad/once_cell/blob/v1.19.0/src/race.rs#L294.
Performs lazy evaluation and can be used for statics.
Implementations§
Source§impl<T, F> RacyLock<T, F>where
F: Fn() -> T,
impl<T, F> RacyLock<T, F>where
F: Fn() -> T,
Sourcepub const fn new(f: F) -> RacyLock<T, F>
pub const fn new(f: F) -> RacyLock<T, F>
Creates a new lazy, racy value with the given initializing function.
Sourcepub fn force(this: &RacyLock<T, F>) -> &T
pub fn force(this: &RacyLock<T, F>) -> &T
Forces the evaluation of the locked value and returns a reference to
the result. This is equivalent to the Self::deref.
There is no blocking involved in this operation. Instead, concurrent threads will race to set the underlying pointer. Memory allocated by losing threads will be dropped immediately after they fail to set the pointer.
This function’s interface is designed around std::sync::LazyLock::force but
the implementation is derived from once_cell::race::OnceBox::get_or_try_init.
Trait Implementations§
impl<T, F> Send for RacyLock<T, F>
impl<T, F> Sync for RacyLock<T, F>
Auto Trait Implementations§
impl<T, F = fn() -> T> !Freeze for RacyLock<T, F>
impl<T, F> RefUnwindSafe for RacyLock<T, F>where
F: RefUnwindSafe,
impl<T, F> Unpin for RacyLock<T, F>where
F: Unpin,
impl<T, F> UnwindSafe for RacyLock<T, F>where
F: UnwindSafe,
T: RefUnwindSafe,
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
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>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read moreSource§fn fg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
Source§fn bg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
Source§fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
Source§fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<P, T> SmtStorage for P
impl<P, T> SmtStorage for P
Source§fn get_root(&self) -> Result<Option<Word>, StorageError>
fn get_root(&self) -> Result<Option<Word>, StorageError>
Ok(None) if no root has been set or an empty SMT is represented. Read moreSource§fn set_root(&self, root: Word) -> Result<(), StorageError>
fn set_root(&self, root: Word) -> Result<(), StorageError>
Source§fn leaf_count(&self) -> Result<usize, StorageError>
fn leaf_count(&self) -> Result<usize, StorageError>
Source§fn entry_count(&self) -> Result<usize, StorageError>
fn entry_count(&self) -> Result<usize, StorageError>
Source§fn insert_value(
&self,
index: u64,
key: Word,
value: Word,
) -> Result<Option<Word>, StorageError>
fn insert_value( &self, index: u64, key: Word, value: Word, ) -> Result<Option<Word>, StorageError>
index. Read moreSource§fn remove_value(
&self,
index: u64,
key: Word,
) -> Result<Option<Word>, StorageError>
fn remove_value( &self, index: u64, key: Word, ) -> Result<Option<Word>, StorageError>
index. Read moreSource§fn get_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError>
fn get_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError>
index.
Returns Ok(None) if no leaf exists at the given index.Source§fn set_leaves(&self, leaves: BTreeMap<u64, SmtLeaf>) -> Result<(), StorageError>
fn set_leaves(&self, leaves: BTreeMap<u64, SmtLeaf>) -> Result<(), StorageError>
Source§fn remove_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError>
fn remove_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError>
index. Read moreSource§fn get_leaves(
&self,
indices: &[u64],
) -> Result<Vec<Option<SmtLeaf>>, StorageError>
fn get_leaves( &self, indices: &[u64], ) -> Result<Vec<Option<SmtLeaf>>, StorageError>
indices. Read moreSource§fn has_leaves(&self) -> Result<bool, StorageError>
fn has_leaves(&self) -> Result<bool, StorageError>
Source§fn get_subtree(&self, index: NodeIndex) -> Result<Option<Subtree>, StorageError>
fn get_subtree(&self, index: NodeIndex) -> Result<Option<Subtree>, StorageError>
NodeIndex. Read moreSource§fn get_subtrees(
&self,
indices: &[NodeIndex],
) -> Result<Vec<Option<Subtree>>, StorageError>
fn get_subtrees( &self, indices: &[NodeIndex], ) -> Result<Vec<Option<Subtree>>, StorageError>
NodeIndex values. Read moreSource§fn set_subtree(&self, subtree: &Subtree) -> Result<(), StorageError>
fn set_subtree(&self, subtree: &Subtree) -> Result<(), StorageError>
NodeIndex. Read moreSource§fn set_subtrees(&self, subtrees: Vec<Subtree>) -> Result<(), StorageError>
fn set_subtrees(&self, subtrees: Vec<Subtree>) -> Result<(), StorageError>
Source§fn remove_subtree(&self, index: NodeIndex) -> Result<(), StorageError>
fn remove_subtree(&self, index: NodeIndex) -> Result<(), StorageError>
NodeIndex. Read moreSource§fn get_inner_node(
&self,
index: NodeIndex,
) -> Result<Option<InnerNode>, StorageError>
fn get_inner_node( &self, index: NodeIndex, ) -> Result<Option<InnerNode>, StorageError>
Source§fn set_inner_node(
&self,
index: NodeIndex,
node: InnerNode,
) -> Result<Option<InnerNode>, StorageError>
fn set_inner_node( &self, index: NodeIndex, node: InnerNode, ) -> Result<Option<InnerNode>, StorageError>
Source§fn remove_inner_node(
&self,
index: NodeIndex,
) -> Result<Option<InnerNode>, StorageError>
fn remove_inner_node( &self, index: NodeIndex, ) -> Result<Option<InnerNode>, StorageError>
Source§fn apply(&self, updates: StorageUpdates) -> Result<(), StorageError>
fn apply(&self, updates: StorageUpdates) -> Result<(), StorageError>
StorageUpdates atomically to the storage backend. Read more