Struct spin::Once

source ·
pub struct Once<T> { /* private fields */ }
Expand description

A synchronization primitive which can be used to run a one-time global initialization. Unlike its std equivalent, this is generalized so that the closure returns a value and it is stored. Once therefore acts something like a future, too.

§Examples

use spin;

static START: spin::Once<()> = spin::Once::new();

START.call_once(|| {
    // run initialization here
});

Implementations§

source§

impl<T> Once<T>

source

pub const INIT: Self = _

Initialization constant of Once.

source

pub const fn new() -> Once<T>

Creates a new Once value.

source

pub fn call_once<'a, F>(&'a self, builder: F) -> &'a T
where F: FnOnce() -> T,

Performs an initialization routine once and only once. The given closure will be executed if this is the first time call_once has been called, and otherwise the routine will not be invoked.

This method will block the calling thread if another initialization routine is currently running.

When this function returns, it is guaranteed that some initialization has run and completed (it may not be the closure specified). The returned pointer will point to the result from the closure that was run.

§Examples
use spin;

static INIT: spin::Once<usize> = spin::Once::new();

fn get_cached_val() -> usize {
    *INIT.call_once(expensive_computation)
}

fn expensive_computation() -> usize {
    // ...
}
source

pub fn try<'a>(&'a self) -> Option<&'a T>

Returns a pointer iff the Once was previously initialized

source

pub fn wait<'a>(&'a self) -> Option<&'a T>

Like try, but will spin if the Once is in the process of being initialized

Trait Implementations§

source§

impl<T: Debug> Debug for Once<T>

source§

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

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

impl<T: Send> Send for Once<T>

source§

impl<T: Send + Sync> Sync for Once<T>

Auto Trait Implementations§

§

impl<T> !Freeze for Once<T>

§

impl<T> !RefUnwindSafe for Once<T>

§

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

§

impl<T> UnwindSafe for Once<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
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, U> TryFrom<U> for T
where U: Into<T>,

§

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

§

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.