#[cfg(target_has_atomic = "8")]
#[stable(feature = "rust1", since = "1.0.0")]
impl Default for AtomicBool {
- /// Creates an `AtomicBool` initialised as false.
+ /// Creates an `AtomicBool` initialized to `false`.
fn default() -> Self {
Self::new(false)
}
/// sequentially consistent operations in the same order.
#[stable(feature = "rust1", since = "1.0.0")]
SeqCst,
+ // Prevent exhaustive matching to allow for future extension
+ #[doc(hidden)]
+ #[unstable(feature = "future_atomic_orderings", issue = "0")]
+ __Nonexhaustive,
}
/// An `AtomicBool` initialized to `false`.
#[inline]
#[stable(feature = "rust1", since = "1.0.0")]
pub fn store(&self, val: bool, order: Ordering) {
- unsafe { atomic_store(self.v.get(), val as u8, order); }
+ unsafe {
+ atomic_store(self.v.get(), val as u8, order);
+ }
}
/// Stores a value into the bool, returning the old value.
current: bool,
new: bool,
success: Ordering,
- failure: Ordering) -> Result<bool, bool> {
- match unsafe { atomic_compare_exchange(self.v.get(), current as u8, new as u8,
- success, failure) } {
+ failure: Ordering)
+ -> Result<bool, bool> {
+ match unsafe {
+ atomic_compare_exchange(self.v.get(), current as u8, new as u8, success, failure)
+ } {
Ok(x) => Ok(x != 0),
Err(x) => Err(x != 0),
}
current: bool,
new: bool,
success: Ordering,
- failure: Ordering) -> Result<bool, bool> {
- match unsafe { atomic_compare_exchange_weak(self.v.get(), current as u8, new as u8,
- success, failure) } {
+ failure: Ordering)
+ -> Result<bool, bool> {
+ match unsafe {
+ atomic_compare_exchange_weak(self.v.get(), current as u8, new as u8, success, failure)
+ } {
Ok(x) => Ok(x != 0),
Err(x) => Err(x != 0),
}
#[inline]
#[stable(feature = "rust1", since = "1.0.0")]
pub fn load(&self, order: Ordering) -> *mut T {
- unsafe {
- atomic_load(self.p.get() as *mut usize, order) as *mut T
- }
+ unsafe { atomic_load(self.p.get() as *mut usize, order) as *mut T }
}
/// Stores a value into the pointer.
#[inline]
#[stable(feature = "rust1", since = "1.0.0")]
pub fn store(&self, ptr: *mut T, order: Ordering) {
- unsafe { atomic_store(self.p.get() as *mut usize, ptr as usize, order); }
+ unsafe {
+ atomic_store(self.p.get() as *mut usize, ptr as usize, order);
+ }
}
/// Stores a value into the pointer, returning the old value.
current: *mut T,
new: *mut T,
success: Ordering,
- failure: Ordering) -> Result<*mut T, *mut T> {
+ failure: Ordering)
+ -> Result<*mut T, *mut T> {
unsafe {
let res = atomic_compare_exchange(self.p.get() as *mut usize,
current as usize,
current: *mut T,
new: *mut T,
success: Ordering,
- failure: Ordering) -> Result<*mut T, *mut T> {
+ failure: Ordering)
+ -> Result<*mut T, *mut T> {
unsafe {
let res = atomic_compare_exchange_weak(self.p.get() as *mut usize,
current as usize,
match order {
Release => Relaxed,
Relaxed => Relaxed,
- SeqCst => SeqCst,
+ SeqCst => SeqCst,
Acquire => Acquire,
- AcqRel => Acquire,
+ AcqRel => Acquire,
+ __Nonexhaustive => __Nonexhaustive,
}
}
match order {
Release => intrinsics::atomic_store_rel(dst, val),
Relaxed => intrinsics::atomic_store_relaxed(dst, val),
- SeqCst => intrinsics::atomic_store(dst, val),
+ SeqCst => intrinsics::atomic_store(dst, val),
Acquire => panic!("there is no such thing as an acquire store"),
- AcqRel => panic!("there is no such thing as an acquire/release store"),
+ AcqRel => panic!("there is no such thing as an acquire/release store"),
+ __Nonexhaustive => panic!("invalid memory ordering"),
}
}
match order {
Acquire => intrinsics::atomic_load_acq(dst),
Relaxed => intrinsics::atomic_load_relaxed(dst),
- SeqCst => intrinsics::atomic_load(dst),
+ SeqCst => intrinsics::atomic_load(dst),
Release => panic!("there is no such thing as a release load"),
- AcqRel => panic!("there is no such thing as an acquire/release load"),
+ AcqRel => panic!("there is no such thing as an acquire/release load"),
+ __Nonexhaustive => panic!("invalid memory ordering"),
}
}
match order {
Acquire => intrinsics::atomic_xchg_acq(dst, val),
Release => intrinsics::atomic_xchg_rel(dst, val),
- AcqRel => intrinsics::atomic_xchg_acqrel(dst, val),
+ AcqRel => intrinsics::atomic_xchg_acqrel(dst, val),
Relaxed => intrinsics::atomic_xchg_relaxed(dst, val),
- SeqCst => intrinsics::atomic_xchg(dst, val)
+ SeqCst => intrinsics::atomic_xchg(dst, val),
+ __Nonexhaustive => panic!("invalid memory ordering"),
}
}
match order {
Acquire => intrinsics::atomic_xadd_acq(dst, val),
Release => intrinsics::atomic_xadd_rel(dst, val),
- AcqRel => intrinsics::atomic_xadd_acqrel(dst, val),
+ AcqRel => intrinsics::atomic_xadd_acqrel(dst, val),
Relaxed => intrinsics::atomic_xadd_relaxed(dst, val),
- SeqCst => intrinsics::atomic_xadd(dst, val)
+ SeqCst => intrinsics::atomic_xadd(dst, val),
+ __Nonexhaustive => panic!("invalid memory ordering"),
}
}
match order {
Acquire => intrinsics::atomic_xsub_acq(dst, val),
Release => intrinsics::atomic_xsub_rel(dst, val),
- AcqRel => intrinsics::atomic_xsub_acqrel(dst, val),
+ AcqRel => intrinsics::atomic_xsub_acqrel(dst, val),
Relaxed => intrinsics::atomic_xsub_relaxed(dst, val),
- SeqCst => intrinsics::atomic_xsub(dst, val)
+ SeqCst => intrinsics::atomic_xsub(dst, val),
+ __Nonexhaustive => panic!("invalid memory ordering"),
}
}
old: T,
new: T,
success: Ordering,
- failure: Ordering) -> Result<T, T> {
+ failure: Ordering)
+ -> Result<T, T> {
let (val, ok) = match (success, failure) {
(Acquire, Acquire) => intrinsics::atomic_cxchg_acq(dst, old, new),
(Release, Relaxed) => intrinsics::atomic_cxchg_rel(dst, old, new),
- (AcqRel, Acquire) => intrinsics::atomic_cxchg_acqrel(dst, old, new),
+ (AcqRel, Acquire) => intrinsics::atomic_cxchg_acqrel(dst, old, new),
(Relaxed, Relaxed) => intrinsics::atomic_cxchg_relaxed(dst, old, new),
- (SeqCst, SeqCst) => intrinsics::atomic_cxchg(dst, old, new),
+ (SeqCst, SeqCst) => intrinsics::atomic_cxchg(dst, old, new),
(Acquire, Relaxed) => intrinsics::atomic_cxchg_acq_failrelaxed(dst, old, new),
- (AcqRel, Relaxed) => intrinsics::atomic_cxchg_acqrel_failrelaxed(dst, old, new),
- (SeqCst, Relaxed) => intrinsics::atomic_cxchg_failrelaxed(dst, old, new),
- (SeqCst, Acquire) => intrinsics::atomic_cxchg_failacq(dst, old, new),
+ (AcqRel, Relaxed) => intrinsics::atomic_cxchg_acqrel_failrelaxed(dst, old, new),
+ (SeqCst, Relaxed) => intrinsics::atomic_cxchg_failrelaxed(dst, old, new),
+ (SeqCst, Acquire) => intrinsics::atomic_cxchg_failacq(dst, old, new),
+ (__Nonexhaustive, _) => panic!("invalid memory ordering"),
+ (_, __Nonexhaustive) => panic!("invalid memory ordering"),
(_, AcqRel) => panic!("there is no such thing as an acquire/release failure ordering"),
(_, Release) => panic!("there is no such thing as a release failure ordering"),
_ => panic!("a failure ordering can't be stronger than a success ordering"),
};
- if ok {
- Ok(val)
- } else {
- Err(val)
- }
+ if ok { Ok(val) } else { Err(val) }
}
#[inline]
old: T,
new: T,
success: Ordering,
- failure: Ordering) -> Result<T, T> {
+ failure: Ordering)
+ -> Result<T, T> {
let (val, ok) = match (success, failure) {
(Acquire, Acquire) => intrinsics::atomic_cxchgweak_acq(dst, old, new),
(Release, Relaxed) => intrinsics::atomic_cxchgweak_rel(dst, old, new),
- (AcqRel, Acquire) => intrinsics::atomic_cxchgweak_acqrel(dst, old, new),
+ (AcqRel, Acquire) => intrinsics::atomic_cxchgweak_acqrel(dst, old, new),
(Relaxed, Relaxed) => intrinsics::atomic_cxchgweak_relaxed(dst, old, new),
- (SeqCst, SeqCst) => intrinsics::atomic_cxchgweak(dst, old, new),
+ (SeqCst, SeqCst) => intrinsics::atomic_cxchgweak(dst, old, new),
(Acquire, Relaxed) => intrinsics::atomic_cxchgweak_acq_failrelaxed(dst, old, new),
- (AcqRel, Relaxed) => intrinsics::atomic_cxchgweak_acqrel_failrelaxed(dst, old, new),
- (SeqCst, Relaxed) => intrinsics::atomic_cxchgweak_failrelaxed(dst, old, new),
- (SeqCst, Acquire) => intrinsics::atomic_cxchgweak_failacq(dst, old, new),
+ (AcqRel, Relaxed) => intrinsics::atomic_cxchgweak_acqrel_failrelaxed(dst, old, new),
+ (SeqCst, Relaxed) => intrinsics::atomic_cxchgweak_failrelaxed(dst, old, new),
+ (SeqCst, Acquire) => intrinsics::atomic_cxchgweak_failacq(dst, old, new),
+ (__Nonexhaustive, _) => panic!("invalid memory ordering"),
+ (_, __Nonexhaustive) => panic!("invalid memory ordering"),
(_, AcqRel) => panic!("there is no such thing as an acquire/release failure ordering"),
(_, Release) => panic!("there is no such thing as a release failure ordering"),
_ => panic!("a failure ordering can't be stronger than a success ordering"),
};
- if ok {
- Ok(val)
- } else {
- Err(val)
- }
+ if ok { Ok(val) } else { Err(val) }
}
#[inline]
match order {
Acquire => intrinsics::atomic_and_acq(dst, val),
Release => intrinsics::atomic_and_rel(dst, val),
- AcqRel => intrinsics::atomic_and_acqrel(dst, val),
+ AcqRel => intrinsics::atomic_and_acqrel(dst, val),
Relaxed => intrinsics::atomic_and_relaxed(dst, val),
- SeqCst => intrinsics::atomic_and(dst, val)
+ SeqCst => intrinsics::atomic_and(dst, val),
+ __Nonexhaustive => panic!("invalid memory ordering"),
}
}
match order {
Acquire => intrinsics::atomic_or_acq(dst, val),
Release => intrinsics::atomic_or_rel(dst, val),
- AcqRel => intrinsics::atomic_or_acqrel(dst, val),
+ AcqRel => intrinsics::atomic_or_acqrel(dst, val),
Relaxed => intrinsics::atomic_or_relaxed(dst, val),
- SeqCst => intrinsics::atomic_or(dst, val)
+ SeqCst => intrinsics::atomic_or(dst, val),
+ __Nonexhaustive => panic!("invalid memory ordering"),
}
}
match order {
Acquire => intrinsics::atomic_xor_acq(dst, val),
Release => intrinsics::atomic_xor_rel(dst, val),
- AcqRel => intrinsics::atomic_xor_acqrel(dst, val),
+ AcqRel => intrinsics::atomic_xor_acqrel(dst, val),
Relaxed => intrinsics::atomic_xor_relaxed(dst, val),
- SeqCst => intrinsics::atomic_xor(dst, val)
+ SeqCst => intrinsics::atomic_xor(dst, val),
+ __Nonexhaustive => panic!("invalid memory ordering"),
}
}
match order {
Acquire => intrinsics::atomic_fence_acq(),
Release => intrinsics::atomic_fence_rel(),
- AcqRel => intrinsics::atomic_fence_acqrel(),
- SeqCst => intrinsics::atomic_fence(),
- Relaxed => panic!("there is no such thing as a relaxed fence")
+ AcqRel => intrinsics::atomic_fence_acqrel(),
+ SeqCst => intrinsics::atomic_fence(),
+ Relaxed => panic!("there is no such thing as a relaxed fence"),
+ __Nonexhaustive => panic!("invalid memory ordering"),
}
}
}