RacyLock

Struct RacyLock 

Source
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,

Source

pub const fn new(f: F) -> RacyLock<T, F>

Creates a new lazy, racy value with the given initializing function.

Source

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§

Source§

impl<T, F> Debug for RacyLock<T, F>
where T: Debug, F: Fn() -> T,

Source§

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

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

impl<T> Default for RacyLock<T>
where T: Default,

Source§

fn default() -> RacyLock<T>

Creates a new lock that will evaluate the underlying value based on T::default.

Source§

impl<T, F> Deref for RacyLock<T, F>
where F: Fn() -> T,

Source§

fn deref(&self) -> &T

Either sets or retrieves the value, and dereferences it.

See Self::force for more details.

Source§

type Target = T

The resulting type after dereferencing.
Source§

impl<T, F> Drop for RacyLock<T, F>

Source§

fn drop(&mut self)

Drops the underlying pointer.

Source§

impl<T, F> Send for RacyLock<T, F>
where T: Send, F: Send,

Source§

impl<T, F> Sync for RacyLock<T, F>
where T: Send + Sync, F: Send,

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>

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

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

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

Initializes a with the given initializer. Read more
Source§

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

Dereferences the given pointer. Read more
Source§

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

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. 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.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<P, T> SmtStorage for P
where P: Deref<Target = T> + Debug + Send + Sync + 'static, T: SmtStorage + ?Sized,

Source§

fn get_root(&self) -> Result<Option<Word>, StorageError>

Retrieves the current root hash of the Sparse Merkle Tree. Returns Ok(None) if no root has been set or an empty SMT is represented. Read more
Source§

fn set_root(&self, root: Word) -> Result<(), StorageError>

Sets or updates the root hash of the Sparse Merkle Tree. Read more
Source§

fn leaf_count(&self) -> Result<usize, StorageError>

Retrieves the total number of leaf nodes currently stored. Read more
Source§

fn entry_count(&self) -> Result<usize, StorageError>

Retrieves the total number of unique key-value entries across all leaf nodes. Read more
Source§

fn insert_value( &self, index: u64, key: Word, value: Word, ) -> Result<Option<Word>, StorageError>

Inserts a key-value pair into the SMT leaf at the specified logical index. Read more
Source§

fn remove_value( &self, index: u64, key: Word, ) -> Result<Option<Word>, StorageError>

Removes a key-value pair from the SMT leaf at the specified logical index. Read more
Source§

fn get_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError>

Retrieves a single SMT leaf node by its logical index. Returns Ok(None) if no leaf exists at the given index.
Source§

fn set_leaves(&self, leaves: BTreeMap<u64, SmtLeaf>) -> Result<(), StorageError>

Sets or updates multiple SMT leaf nodes in storage. Read more
Source§

fn remove_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError>

Removes a single SMT leaf node entirely from storage by its logical index. Read more
Source§

fn get_leaves( &self, indices: &[u64], ) -> Result<Vec<Option<SmtLeaf>>, StorageError>

Retrieves multiple SMT leaf nodes by their logical indices. Read more
Source§

fn has_leaves(&self) -> Result<bool, StorageError>

Returns true if the storage has any leaves. Read more
Source§

fn get_subtree(&self, index: NodeIndex) -> Result<Option<Subtree>, StorageError>

Retrieves a single SMT Subtree by its root NodeIndex. Read more
Source§

fn get_subtrees( &self, indices: &[NodeIndex], ) -> Result<Vec<Option<Subtree>>, StorageError>

Retrieves multiple Subtrees by their root NodeIndex values. Read more
Source§

fn set_subtree(&self, subtree: &Subtree) -> Result<(), StorageError>

Sets or updates a single SMT Subtree in storage, identified by its root NodeIndex. Read more
Source§

fn set_subtrees(&self, subtrees: Vec<Subtree>) -> Result<(), StorageError>

Sets or updates multiple SMT Subtrees in storage. Read more
Source§

fn remove_subtree(&self, index: NodeIndex) -> Result<(), StorageError>

Removes a single SMT Subtree from storage, identified by its root NodeIndex. Read more
Source§

fn get_inner_node( &self, index: NodeIndex, ) -> Result<Option<InnerNode>, StorageError>

Retrieves a single inner node from within a Subtree. Read more
Source§

fn set_inner_node( &self, index: NodeIndex, node: InnerNode, ) -> Result<Option<InnerNode>, StorageError>

Sets or updates a single inner node (non-leaf node) within a Subtree. Read more
Source§

fn remove_inner_node( &self, index: NodeIndex, ) -> Result<Option<InnerNode>, StorageError>

Removes a single inner node (non-leaf node) from within a Subtree. Read more
Source§

fn apply(&self, updates: StorageUpdates) -> Result<(), StorageError>

Applies a batch of StorageUpdates atomically to the storage backend. Read more
Source§

fn iter_leaves( &self, ) -> Result<Box<dyn Iterator<Item = (u64, SmtLeaf)> + '_>, StorageError>

Returns an iterator over all (logical_index, SmtLeaf) pairs currently in storage. Read more
Source§

fn iter_subtrees( &self, ) -> Result<Box<dyn Iterator<Item = Subtree> + '_>, StorageError>

Returns an iterator over all Subtree instances currently in storage. Read more
Source§

fn get_depth24(&self) -> Result<Vec<(u64, Word)>, StorageError>

Retrieves all depth 24 hashes from storage for efficient startup reconstruction. Read more
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.
Source§

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

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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