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!(); }