[−][src]Struct abi_stable::external_types::parking_lot::once::ROnce
A synchronization primitive for running global initialization once.
Example
use abi_stable::external_types::{ROnce,RMutex}; static MUTEX:RMutex<usize>=RMutex::new(0); static ONCE:ROnce=ROnce::new(); let guards= std::iter::repeat_with(||{ std::thread::spawn(||{ ONCE.call_once(||{ *MUTEX.lock()+=1; }) }) }) .take(20) .collect::<Vec<_>>(); for guard in guards{ guard.join().unwrap(); } assert_eq!(*MUTEX.lock(),1);
Implementations
impl ROnce
[src]
pub const fn new() -> ROnce
[src]
Constructs an ROnce.
Example
use abi_stable::external_types::ROnce; static ONCE: ROnce = ROnce::new();
pub const NEW: Self
[src]
pub fn state(&self) -> ROnceState
[src]
Gets the running state of this ROnce.
Example
use abi_stable::external_types::parking_lot::once::{ROnce,ROnceState}; use std::panic::AssertUnwindSafe; let once=ROnce::new(); assert_eq!(once.state(), ROnceState::New ); let _=std::panic::catch_unwind(AssertUnwindSafe(||{ once.call_once(|| panic!() ); })); assert!( once.state().poisoned() ); once.call_once_force(|_| () ); assert!( once.state().done() );
pub fn call_once<F>(&self, f: F) where
F: FnOnce(),
[src]
F: FnOnce(),
Runs an initialization function.
f
will be run only if this is the first time this method has been called
on this ROnce.
Once this function returns it is guaranteed that some closure passed to this method has run to completion.
Panics
Panics in the closure will cause this ROnce to become poisoned, and any future calls to this method will panic.
Example
use abi_stable::external_types::ROnce; let once=ROnce::new(); let mut counter=0usize; once.call_once(|| counter+=1 ); once.call_once(|| counter+=1 ); once.call_once(|| counter+=1 ); once.call_once(|| counter+=1 ); assert_eq!(counter,1);
pub fn call_once_force<F>(&self, f: F) where
F: FnOnce(ROnceState),
[src]
F: FnOnce(ROnceState),
Runs an initialization function,even if the ROnce is poisoned.
This will keep trying to run different closures until one of them doesn't panic.
The ROnceState parameter describes whether the ROnce is New or Poisoned.
Example
use abi_stable::external_types::ROnce; use std::panic::{self,AssertUnwindSafe}; let once=ROnce::new(); let mut counter=0usize; for i in 0..100 { let _=panic::catch_unwind(AssertUnwindSafe(||{ once.call_once_force(|_|{ if i < 6 { panic!(); } counter=i; }) })); } assert_eq!(counter,6);
Trait Implementations
impl Debug for ROnce
[src]
impl Default for ROnce
[src]
impl GetStaticEquivalent_ for ROnce
[src]
type StaticEquivalent = _static_ROnce
impl Send for ROnce
[src]
impl StableAbi for ROnce
[src]
type IsNonZeroType = False
Whether this type has a single invalid bit-pattern. Read more
pub const LAYOUT: &'static TypeLayout
[src]
pub const ABI_CONSTS: AbiConsts
[src]
impl Sync for ROnce
[src]
Auto Trait Implementations
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T> GetWithMetadata for T
[src]
type ForSelf = WithMetadata_<T, T>
This is always WithMetadata_<Self, Self>
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> SelfOps for T where
T: ?Sized,
[src]
T: ?Sized,
pub const T: PhantomData<fn() -> Self>
[src]
pub const T_D: PhantomData<Self>
[src]
pub fn assert_ty(self, _other: PhantomData<fn() -> Self>) -> Self
[src]
pub fn assert_ty_ref(&self, _other: PhantomData<fn() -> Self>) -> &Self
[src]
pub fn assert_ty_mut(&mut self, _other: PhantomData<fn() -> Self>) -> &mut Self
[src]
pub fn ty_(&self) -> PhantomData<fn() -> Self>
[src]
pub fn ty_d(&self) -> PhantomData<Self>
[src]
pub fn ty_inv(&self) -> PhantomData<fn(Self) -> Self>
[src]
pub fn ty_inv_ref(&self) -> PhantomData<Cell<&Self>>
[src]
pub fn eq_id(&self, other: &Self) -> bool
[src]
pub fn piped<F, U>(self, f: F) -> U where
F: FnOnce(Self) -> U,
[src]
F: FnOnce(Self) -> U,
pub fn piped_ref<'a, F, U>(&'a self, f: F) -> U where
F: FnOnce(&'a Self) -> U,
[src]
F: FnOnce(&'a Self) -> U,
pub fn piped_mut<'a, F, U>(&'a mut self, f: F) -> U where
F: FnOnce(&'a mut Self) -> U,
[src]
F: FnOnce(&'a mut Self) -> U,
pub fn mutated<F>(self, f: F) -> Self where
F: FnOnce(&mut Self),
[src]
F: FnOnce(&mut Self),
pub fn observe<F>(self, f: F) -> Self where
F: FnOnce(&Self),
[src]
F: FnOnce(&Self),
pub fn into_<T>(self, PhantomData<fn() -> T>) -> T where
Self: Into<T>,
[src]
Self: Into<T>,
pub fn as_ref_<T>(&self) -> &T where
Self: AsRef<T>,
T: ?Sized,
[src]
Self: AsRef<T>,
T: ?Sized,
pub fn as_mut_<T>(&mut self) -> &mut T where
Self: AsMut<T>,
T: ?Sized,
[src]
Self: AsMut<T>,
T: ?Sized,
pub fn drop_(self)
[src]
impl<This> TransmuteElement for This where
This: ?Sized,
[src]
This: ?Sized,
pub unsafe fn transmute_element<T>(self) -> Self::TransmutedPtr where
Self: CanTransmuteElement<T>,
Self::Target: Sized,
[src]
Self: CanTransmuteElement<T>,
Self::Target: Sized,
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The error type returned when the conversion fails.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T> TypeIdentity for T where
T: ?Sized,
[src]
T: ?Sized,
type Type = T
The same type as Self. Read more
pub fn into_type_val(self) -> Self::Type where
Self::Type: Sized,
[src]
Self::Type: Sized,
pub fn into_type_ref(&self) -> &Self::Type
[src]
pub fn into_type_mut(&mut self) -> &mut Self::Type
[src]
pub fn into_type_box(self: Box<Self, Global>) -> Box<Self::Type, Global>
[src]
pub fn into_type_arc(this: Arc<Self>) -> Arc<Self::Type>
[src]
pub fn into_type_rc(this: Rc<Self>) -> Rc<Self::Type>
[src]
pub fn from_type_val(this: Self::Type) -> Self where
Self::Type: Sized,
[src]
Self::Type: Sized,