|
|
|
@ -113,8 +113,8 @@
|
|
|
|
|
//! ```
|
|
|
|
|
|
|
|
|
|
#![stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#![cfg_attr(not(target_has_atomic = "8"), allow(dead_code))]
|
|
|
|
|
#![cfg_attr(not(target_has_atomic = "8"), allow(unused_imports))]
|
|
|
|
|
#![cfg_attr(not(target_has_atomic_load_store = "8"), allow(dead_code))]
|
|
|
|
|
#![cfg_attr(not(target_has_atomic_load_store = "8"), allow(unused_imports))]
|
|
|
|
|
|
|
|
|
|
use self::Ordering::*;
|
|
|
|
|
|
|
|
|
@ -160,14 +160,14 @@ pub fn spin_loop_hint() {
|
|
|
|
|
/// This type has the same in-memory representation as a [`bool`].
|
|
|
|
|
///
|
|
|
|
|
/// [`bool`]: ../../../std/primitive.bool.html
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[repr(C, align(1))]
|
|
|
|
|
pub struct AtomicBool {
|
|
|
|
|
v: UnsafeCell<u8>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
impl Default for AtomicBool {
|
|
|
|
|
/// Creates an `AtomicBool` initialized to `false`.
|
|
|
|
@ -177,14 +177,14 @@ impl Default for AtomicBool {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Send is implicitly implemented for AtomicBool.
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
unsafe impl Sync for AtomicBool {}
|
|
|
|
|
|
|
|
|
|
/// A raw pointer type which can be safely shared between threads.
|
|
|
|
|
///
|
|
|
|
|
/// This type has the same in-memory representation as a `*mut T`.
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[cfg_attr(target_pointer_width = "16", repr(C, align(2)))]
|
|
|
|
|
#[cfg_attr(target_pointer_width = "32", repr(C, align(4)))]
|
|
|
|
@ -193,7 +193,7 @@ pub struct AtomicPtr<T> {
|
|
|
|
|
p: UnsafeCell<*mut T>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
impl<T> Default for AtomicPtr<T> {
|
|
|
|
|
/// Creates a null `AtomicPtr<T>`.
|
|
|
|
@ -202,10 +202,10 @@ impl<T> Default for AtomicPtr<T> {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
unsafe impl<T> Send for AtomicPtr<T> {}
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
unsafe impl<T> Sync for AtomicPtr<T> {}
|
|
|
|
|
|
|
|
|
@ -306,7 +306,7 @@ pub enum Ordering {
|
|
|
|
|
/// An [`AtomicBool`] initialized to `false`.
|
|
|
|
|
///
|
|
|
|
|
/// [`AtomicBool`]: struct.AtomicBool.html
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[rustc_deprecated(
|
|
|
|
|
since = "1.34.0",
|
|
|
|
@ -315,7 +315,7 @@ pub enum Ordering {
|
|
|
|
|
)]
|
|
|
|
|
pub const ATOMIC_BOOL_INIT: AtomicBool = AtomicBool::new(false);
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
impl AtomicBool {
|
|
|
|
|
/// Creates a new `AtomicBool`.
|
|
|
|
|
///
|
|
|
|
@ -464,7 +464,7 @@ impl AtomicBool {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
pub fn swap(&self, val: bool, order: Ordering) -> bool {
|
|
|
|
|
unsafe { atomic_swap(self.v.get(), val as u8, order) != 0 }
|
|
|
|
|
}
|
|
|
|
@ -502,7 +502,7 @@ impl AtomicBool {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
pub fn compare_and_swap(&self, current: bool, new: bool, order: Ordering) -> bool {
|
|
|
|
|
match self.compare_exchange(current, new, order, strongest_failure_ordering(order)) {
|
|
|
|
|
Ok(x) => x,
|
|
|
|
@ -553,7 +553,7 @@ impl AtomicBool {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "extended_compare_and_swap", since = "1.10.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
pub fn compare_exchange(&self,
|
|
|
|
|
current: bool,
|
|
|
|
|
new: bool,
|
|
|
|
@ -609,7 +609,7 @@ impl AtomicBool {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "extended_compare_and_swap", since = "1.10.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
pub fn compare_exchange_weak(&self,
|
|
|
|
|
current: bool,
|
|
|
|
|
new: bool,
|
|
|
|
@ -660,7 +660,7 @@ impl AtomicBool {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
pub fn fetch_and(&self, val: bool, order: Ordering) -> bool {
|
|
|
|
|
unsafe { atomic_and(self.v.get(), val as u8, order) != 0 }
|
|
|
|
|
}
|
|
|
|
@ -702,7 +702,7 @@ impl AtomicBool {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
pub fn fetch_nand(&self, val: bool, order: Ordering) -> bool {
|
|
|
|
|
// We can't use atomic_nand here because it can result in a bool with
|
|
|
|
|
// an invalid value. This happens because the atomic operation is done
|
|
|
|
@ -755,7 +755,7 @@ impl AtomicBool {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
pub fn fetch_or(&self, val: bool, order: Ordering) -> bool {
|
|
|
|
|
unsafe { atomic_or(self.v.get(), val as u8, order) != 0 }
|
|
|
|
|
}
|
|
|
|
@ -796,13 +796,13 @@ impl AtomicBool {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
pub fn fetch_xor(&self, val: bool, order: Ordering) -> bool {
|
|
|
|
|
unsafe { atomic_xor(self.v.get(), val as u8, order) != 0 }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
impl<T> AtomicPtr<T> {
|
|
|
|
|
/// Creates a new `AtomicPtr`.
|
|
|
|
|
///
|
|
|
|
@ -953,7 +953,7 @@ impl<T> AtomicPtr<T> {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
pub fn swap(&self, ptr: *mut T, order: Ordering) -> *mut T {
|
|
|
|
|
unsafe { atomic_swap(self.p.get() as *mut usize, ptr as usize, order) as *mut T }
|
|
|
|
|
}
|
|
|
|
@ -989,7 +989,7 @@ impl<T> AtomicPtr<T> {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "rust1", since = "1.0.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
pub fn compare_and_swap(&self, current: *mut T, new: *mut T, order: Ordering) -> *mut T {
|
|
|
|
|
match self.compare_exchange(current, new, order, strongest_failure_ordering(order)) {
|
|
|
|
|
Ok(x) => x,
|
|
|
|
@ -1031,7 +1031,7 @@ impl<T> AtomicPtr<T> {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "extended_compare_and_swap", since = "1.10.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
pub fn compare_exchange(&self,
|
|
|
|
|
current: *mut T,
|
|
|
|
|
new: *mut T,
|
|
|
|
@ -1091,7 +1091,7 @@ impl<T> AtomicPtr<T> {
|
|
|
|
|
/// ```
|
|
|
|
|
#[inline]
|
|
|
|
|
#[stable(feature = "extended_compare_and_swap", since = "1.10.0")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
pub fn compare_exchange_weak(&self,
|
|
|
|
|
current: *mut T,
|
|
|
|
|
new: *mut T,
|
|
|
|
@ -1112,7 +1112,7 @@ impl<T> AtomicPtr<T> {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
#[stable(feature = "atomic_bool_from", since = "1.24.0")]
|
|
|
|
|
impl From<bool> for AtomicBool {
|
|
|
|
|
/// Converts a `bool` into an `AtomicBool`.
|
|
|
|
@ -1128,16 +1128,17 @@ impl From<bool> for AtomicBool {
|
|
|
|
|
fn from(b: bool) -> Self { Self::new(b) }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[stable(feature = "atomic_from", since = "1.23.0")]
|
|
|
|
|
impl<T> From<*mut T> for AtomicPtr<T> {
|
|
|
|
|
#[inline]
|
|
|
|
|
fn from(p: *mut T) -> Self { Self::new(p) }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
macro_rules! atomic_int {
|
|
|
|
|
($stable:meta,
|
|
|
|
|
($cfg_cas:meta,
|
|
|
|
|
$stable:meta,
|
|
|
|
|
$stable_cxchg:meta,
|
|
|
|
|
$stable_debug:meta,
|
|
|
|
|
$stable_access:meta,
|
|
|
|
@ -1358,7 +1359,7 @@ assert_eq!(some_var.swap(10, Ordering::Relaxed), 5);
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn swap(&self, val: $int_type, order: Ordering) -> $int_type {
|
|
|
|
|
unsafe { atomic_swap(self.v.get(), val, order) }
|
|
|
|
|
}
|
|
|
|
@ -1398,7 +1399,7 @@ assert_eq!(some_var.load(Ordering::Relaxed), 10);
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn compare_and_swap(&self,
|
|
|
|
|
current: $int_type,
|
|
|
|
|
new: $int_type,
|
|
|
|
@ -1456,7 +1457,7 @@ assert_eq!(some_var.load(Ordering::Relaxed), 10);
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable_cxchg]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn compare_exchange(&self,
|
|
|
|
|
current: $int_type,
|
|
|
|
|
new: $int_type,
|
|
|
|
@ -1508,7 +1509,7 @@ loop {
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable_cxchg]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn compare_exchange_weak(&self,
|
|
|
|
|
current: $int_type,
|
|
|
|
|
new: $int_type,
|
|
|
|
@ -1546,7 +1547,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 10);
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn fetch_add(&self, val: $int_type, order: Ordering) -> $int_type {
|
|
|
|
|
unsafe { atomic_add(self.v.get(), val, order) }
|
|
|
|
|
}
|
|
|
|
@ -1578,7 +1579,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 10);
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn fetch_sub(&self, val: $int_type, order: Ordering) -> $int_type {
|
|
|
|
|
unsafe { atomic_sub(self.v.get(), val, order) }
|
|
|
|
|
}
|
|
|
|
@ -1613,7 +1614,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 0b100001);
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn fetch_and(&self, val: $int_type, order: Ordering) -> $int_type {
|
|
|
|
|
unsafe { atomic_and(self.v.get(), val, order) }
|
|
|
|
|
}
|
|
|
|
@ -1649,7 +1650,7 @@ assert_eq!(foo.load(Ordering::SeqCst), !(0x13 & 0x31));
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable_nand]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn fetch_nand(&self, val: $int_type, order: Ordering) -> $int_type {
|
|
|
|
|
unsafe { atomic_nand(self.v.get(), val, order) }
|
|
|
|
|
}
|
|
|
|
@ -1684,7 +1685,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 0b111111);
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn fetch_or(&self, val: $int_type, order: Ordering) -> $int_type {
|
|
|
|
|
unsafe { atomic_or(self.v.get(), val, order) }
|
|
|
|
|
}
|
|
|
|
@ -1719,7 +1720,7 @@ assert_eq!(foo.load(Ordering::SeqCst), 0b011110);
|
|
|
|
|
```"),
|
|
|
|
|
#[inline]
|
|
|
|
|
#[$stable]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn fetch_xor(&self, val: $int_type, order: Ordering) -> $int_type {
|
|
|
|
|
unsafe { atomic_xor(self.v.get(), val, order) }
|
|
|
|
|
}
|
|
|
|
@ -1769,7 +1770,7 @@ assert_eq!(x.load(Ordering::SeqCst), 9);
|
|
|
|
|
#[unstable(feature = "no_more_cas",
|
|
|
|
|
reason = "no more CAS loops in user code",
|
|
|
|
|
issue = "48655")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn fetch_update<F>(&self,
|
|
|
|
|
mut f: F,
|
|
|
|
|
fetch_order: Ordering,
|
|
|
|
@ -1830,7 +1831,7 @@ assert!(max_foo == 42);
|
|
|
|
|
#[unstable(feature = "atomic_min_max",
|
|
|
|
|
reason = "easier and faster min/max than writing manual CAS loop",
|
|
|
|
|
issue = "48655")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn fetch_max(&self, val: $int_type, order: Ordering) -> $int_type {
|
|
|
|
|
unsafe { $max_fn(self.v.get(), val, order) }
|
|
|
|
|
}
|
|
|
|
@ -1882,7 +1883,7 @@ assert_eq!(min_foo, 12);
|
|
|
|
|
#[unstable(feature = "atomic_min_max",
|
|
|
|
|
reason = "easier and faster min/max than writing manual CAS loop",
|
|
|
|
|
issue = "48655")]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[$cfg_cas]
|
|
|
|
|
pub fn fetch_min(&self, val: $int_type, order: Ordering) -> $int_type {
|
|
|
|
|
unsafe { $min_fn(self.v.get(), val, order) }
|
|
|
|
|
}
|
|
|
|
@ -1892,8 +1893,9 @@ assert_eq!(min_foo, 12);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "8"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
@ -1908,8 +1910,9 @@ atomic_int! {
|
|
|
|
|
"AtomicI8::new(0)",
|
|
|
|
|
i8 AtomicI8 ATOMIC_I8_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "8"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
@ -1924,8 +1927,9 @@ atomic_int! {
|
|
|
|
|
"AtomicU8::new(0)",
|
|
|
|
|
u8 AtomicU8 ATOMIC_U8_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "16")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "16"))]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "16"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
@ -1940,8 +1944,9 @@ atomic_int! {
|
|
|
|
|
"AtomicI16::new(0)",
|
|
|
|
|
i16 AtomicI16 ATOMIC_I16_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "16")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "16"))]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "16"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
@ -1956,8 +1961,9 @@ atomic_int! {
|
|
|
|
|
"AtomicU16::new(0)",
|
|
|
|
|
u16 AtomicU16 ATOMIC_U16_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "32")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "32"))]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "32"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
@ -1972,8 +1978,9 @@ atomic_int! {
|
|
|
|
|
"AtomicI32::new(0)",
|
|
|
|
|
i32 AtomicI32 ATOMIC_I32_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "32")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "32"))]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "32"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
@ -1988,8 +1995,12 @@ atomic_int! {
|
|
|
|
|
"AtomicU32::new(0)",
|
|
|
|
|
u32 AtomicU32 ATOMIC_U32_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "64")]
|
|
|
|
|
#[cfg(any(
|
|
|
|
|
all(bootstrap, target_has_atomic = "64"),
|
|
|
|
|
target_has_atomic_load_store = "64"
|
|
|
|
|
))]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "64"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
@ -2004,8 +2015,12 @@ atomic_int! {
|
|
|
|
|
"AtomicI64::new(0)",
|
|
|
|
|
i64 AtomicI64 ATOMIC_I64_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "64")]
|
|
|
|
|
#[cfg(any(
|
|
|
|
|
all(bootstrap, target_has_atomic = "64"),
|
|
|
|
|
target_has_atomic_load_store = "64"
|
|
|
|
|
))]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "64"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
|
stable(feature = "integer_atomics_stable", since = "1.34.0"),
|
|
|
|
@ -2020,8 +2035,9 @@ atomic_int! {
|
|
|
|
|
"AtomicU64::new(0)",
|
|
|
|
|
u64 AtomicU64 ATOMIC_U64_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "128")]
|
|
|
|
|
#[cfg(target_has_atomic_load_store = "128")]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "128"),
|
|
|
|
|
unstable(feature = "integer_atomics", issue = "32976"),
|
|
|
|
|
unstable(feature = "integer_atomics", issue = "32976"),
|
|
|
|
|
unstable(feature = "integer_atomics", issue = "32976"),
|
|
|
|
@ -2036,8 +2052,9 @@ atomic_int! {
|
|
|
|
|
"AtomicI128::new(0)",
|
|
|
|
|
i128 AtomicI128 ATOMIC_I128_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "128")]
|
|
|
|
|
#[cfg(target_has_atomic_load_store = "128")]
|
|
|
|
|
atomic_int! {
|
|
|
|
|
cfg(target_has_atomic = "128"),
|
|
|
|
|
unstable(feature = "integer_atomics", issue = "32976"),
|
|
|
|
|
unstable(feature = "integer_atomics", issue = "32976"),
|
|
|
|
|
unstable(feature = "integer_atomics", issue = "32976"),
|
|
|
|
@ -2052,20 +2069,24 @@ atomic_int! {
|
|
|
|
|
"AtomicU128::new(0)",
|
|
|
|
|
u128 AtomicU128 ATOMIC_U128_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[cfg(target_pointer_width = "16")]
|
|
|
|
|
macro_rules! ptr_width {
|
|
|
|
|
() => { 2 }
|
|
|
|
|
}
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[cfg(target_pointer_width = "32")]
|
|
|
|
|
macro_rules! ptr_width {
|
|
|
|
|
() => { 4 }
|
|
|
|
|
}
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[cfg(target_pointer_width = "64")]
|
|
|
|
|
macro_rules! ptr_width {
|
|
|
|
|
() => { 8 }
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
atomic_int!{
|
|
|
|
|
cfg(target_has_atomic = "ptr"),
|
|
|
|
|
stable(feature = "rust1", since = "1.0.0"),
|
|
|
|
|
stable(feature = "extended_compare_and_swap", since = "1.10.0"),
|
|
|
|
|
stable(feature = "atomic_debug", since = "1.3.0"),
|
|
|
|
@ -2080,8 +2101,9 @@ atomic_int!{
|
|
|
|
|
"AtomicIsize::new(0)",
|
|
|
|
|
isize AtomicIsize ATOMIC_ISIZE_INIT
|
|
|
|
|
}
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
atomic_int!{
|
|
|
|
|
cfg(target_has_atomic = "ptr"),
|
|
|
|
|
stable(feature = "rust1", since = "1.0.0"),
|
|
|
|
|
stable(feature = "extended_compare_and_swap", since = "1.10.0"),
|
|
|
|
|
stable(feature = "atomic_debug", since = "1.3.0"),
|
|
|
|
@ -2098,7 +2120,7 @@ atomic_int!{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
fn strongest_failure_ordering(order: Ordering) -> Ordering {
|
|
|
|
|
match order {
|
|
|
|
|
Release => Relaxed,
|
|
|
|
@ -2132,7 +2154,7 @@ unsafe fn atomic_load<T>(dst: *const T, order: Ordering) -> T {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_swap<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xchg_acq(dst, val),
|
|
|
|
@ -2145,7 +2167,7 @@ unsafe fn atomic_swap<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
|
|
|
|
|
/// Returns the previous value (like __sync_fetch_and_add).
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_add<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xadd_acq(dst, val),
|
|
|
|
@ -2158,7 +2180,7 @@ unsafe fn atomic_add<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
|
|
|
|
|
/// Returns the previous value (like __sync_fetch_and_sub).
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_sub<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xsub_acq(dst, val),
|
|
|
|
@ -2170,7 +2192,7 @@ unsafe fn atomic_sub<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_compare_exchange<T>(dst: *mut T,
|
|
|
|
|
old: T,
|
|
|
|
|
new: T,
|
|
|
|
@ -2195,7 +2217,7 @@ unsafe fn atomic_compare_exchange<T>(dst: *mut T,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_compare_exchange_weak<T>(dst: *mut T,
|
|
|
|
|
old: T,
|
|
|
|
|
new: T,
|
|
|
|
@ -2220,7 +2242,7 @@ unsafe fn atomic_compare_exchange_weak<T>(dst: *mut T,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_and<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_and_acq(dst, val),
|
|
|
|
@ -2232,7 +2254,7 @@ unsafe fn atomic_and<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_nand<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_nand_acq(dst, val),
|
|
|
|
@ -2244,7 +2266,7 @@ unsafe fn atomic_nand<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_or<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_or_acq(dst, val),
|
|
|
|
@ -2256,7 +2278,7 @@ unsafe fn atomic_or<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_xor<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_xor_acq(dst, val),
|
|
|
|
@ -2269,7 +2291,7 @@ unsafe fn atomic_xor<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
|
|
|
|
|
/// returns the max value (signed comparison)
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_max<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_max_acq(dst, val),
|
|
|
|
@ -2282,7 +2304,7 @@ unsafe fn atomic_max<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
|
|
|
|
|
/// returns the min value (signed comparison)
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_min<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_min_acq(dst, val),
|
|
|
|
@ -2295,7 +2317,7 @@ unsafe fn atomic_min<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
|
|
|
|
|
/// returns the max value (signed comparison)
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_umax<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_umax_acq(dst, val),
|
|
|
|
@ -2308,7 +2330,7 @@ unsafe fn atomic_umax<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
|
|
|
|
|
/// returns the min value (signed comparison)
|
|
|
|
|
#[inline]
|
|
|
|
|
#[cfg(target_has_atomic = "cas")]
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
unsafe fn atomic_umin<T>(dst: *mut T, val: T, order: Ordering) -> T {
|
|
|
|
|
match order {
|
|
|
|
|
Acquire => intrinsics::atomic_umin_acq(dst, val),
|
|
|
|
@ -2506,7 +2528,7 @@ pub fn compiler_fence(order: Ordering) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "8")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "8"))]
|
|
|
|
|
#[stable(feature = "atomic_debug", since = "1.3.0")]
|
|
|
|
|
impl fmt::Debug for AtomicBool {
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
@ -2514,7 +2536,7 @@ impl fmt::Debug for AtomicBool {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[stable(feature = "atomic_debug", since = "1.3.0")]
|
|
|
|
|
impl<T> fmt::Debug for AtomicPtr<T> {
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
@ -2522,7 +2544,7 @@ impl<T> fmt::Debug for AtomicPtr<T> {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(target_has_atomic = "ptr")]
|
|
|
|
|
#[cfg(any(bootstrap, target_has_atomic_load_store = "ptr"))]
|
|
|
|
|
#[stable(feature = "atomic_pointer", since = "1.24.0")]
|
|
|
|
|
impl<T> fmt::Pointer for AtomicPtr<T> {
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
|