1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
//! Synchronized one-time and lazy initialization primitives that permit only
//! non-blocking synchronized initialization operations.
use crate::cell::Unblock;
use crate::state::BlockedState;
use self::internal::NoBlock;
////////////////////////////////////////////////////////////////////////////////////////////////////
// Lazy (type alias)
////////////////////////////////////////////////////////////////////////////////////////////////////
/// A type for lazy initialization of e.g. global static variables, which
/// provides the same functionality as the `lazy_static!` macro.
///
/// This type does not permit any (potentially) blocking operations, only their
/// respective non-blocking counterparts and is thus `#[no_std]` compatible.
///
/// For the API of this type alias, see the API of the generic
/// [`Lazy`](crate::lazy::Lazy) type.
pub type Lazy<T, F = fn() -> T> = crate::lazy::Lazy<T, NoBlock, F>;
////////////////////////////////////////////////////////////////////////////////////////////////////
// OnceCell (type alias)
////////////////////////////////////////////////////////////////////////////////////////////////////
/// An interior mutability cell type which allows synchronized one-time
/// initialization and read-only access exclusively after initialization.
///
/// This type does not permit any (potentially) blocking operations, only their
/// respective non-blocking counterparts and is thus `#[no_std]` compatible.
///
/// For the API of this type alias, see the generic
/// [`OnceCell`](crate::doc::OnceCell) type.
pub type OnceCell<T> = crate::cell::OnceCell<T, NoBlock>;
/// A synchronization primitive which can be used to run a one-time global
/// initialization.
///
/// This type does not permit any (potentially) blocking operations, only their
/// respective non-blocking counterparts and is thus `#[no_std]` compatible.
///
/// For the API of this type alias, see the generic
/// [`OnceCell`](crate::doc::OnceCell) type.
/// This is a specialization with `T = ()`.
pub type Once = crate::cell::OnceCell<(), NoBlock>;
////////////////////////////////////////////////////////////////////////////////////////////////////
// NoBlock
////////////////////////////////////////////////////////////////////////////////////////////////////
mod internal {
/// "Blocking" strategy which does not actually allow blocking.
#[derive(Copy, Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub struct NoBlock;
}
/********** impl Unblock **************************************************************************/
unsafe impl Unblock for NoBlock {
#[inline(always)]
unsafe fn on_unblock(_: BlockedState) {}
}
#[cfg(test)]
mod tests {
generate_tests_non_blocking!();
}