Rollup merge of #72324 - Amanieu:atomic_minmax, r=dtolnay
Stabilize AtomicN::fetch_min and AtomicN::fetch_max Some architectures (ARMv8.1 LSE and RISC-V) have specific instructions for atomic min/max which the compiler can only generate through explicit instrinsics.
This commit is contained in:
@@ -1878,7 +1878,6 @@ using [`Release`] makes the load part [`Relaxed`].
|
|||||||
# Examples
|
# Examples
|
||||||
|
|
||||||
```
|
```
|
||||||
#![feature(atomic_min_max)]
|
|
||||||
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};
|
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};
|
||||||
|
|
||||||
let foo = ", stringify!($atomic_type), "::new(23);
|
let foo = ", stringify!($atomic_type), "::new(23);
|
||||||
@@ -1889,7 +1888,6 @@ assert_eq!(foo.load(Ordering::SeqCst), 42);
|
|||||||
If you want to obtain the maximum value in one step, you can use the following:
|
If you want to obtain the maximum value in one step, you can use the following:
|
||||||
|
|
||||||
```
|
```
|
||||||
#![feature(atomic_min_max)]
|
|
||||||
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};
|
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};
|
||||||
|
|
||||||
let foo = ", stringify!($atomic_type), "::new(23);
|
let foo = ", stringify!($atomic_type), "::new(23);
|
||||||
@@ -1898,9 +1896,7 @@ let max_foo = foo.fetch_max(bar, Ordering::SeqCst).max(bar);
|
|||||||
assert!(max_foo == 42);
|
assert!(max_foo == 42);
|
||||||
```"),
|
```"),
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "atomic_min_max",
|
#[stable(feature = "atomic_min_max", since = "1.45.0")]
|
||||||
reason = "easier and faster min/max than writing manual CAS loop",
|
|
||||||
issue = "48655")]
|
|
||||||
#[$cfg_cas]
|
#[$cfg_cas]
|
||||||
pub fn fetch_max(&self, val: $int_type, order: Ordering) -> $int_type {
|
pub fn fetch_max(&self, val: $int_type, order: Ordering) -> $int_type {
|
||||||
// SAFETY: data races are prevented by atomic intrinsics.
|
// SAFETY: data races are prevented by atomic intrinsics.
|
||||||
@@ -1929,7 +1925,6 @@ using [`Release`] makes the load part [`Relaxed`].
|
|||||||
# Examples
|
# Examples
|
||||||
|
|
||||||
```
|
```
|
||||||
#![feature(atomic_min_max)]
|
|
||||||
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};
|
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};
|
||||||
|
|
||||||
let foo = ", stringify!($atomic_type), "::new(23);
|
let foo = ", stringify!($atomic_type), "::new(23);
|
||||||
@@ -1942,7 +1937,6 @@ assert_eq!(foo.load(Ordering::Relaxed), 22);
|
|||||||
If you want to obtain the minimum value in one step, you can use the following:
|
If you want to obtain the minimum value in one step, you can use the following:
|
||||||
|
|
||||||
```
|
```
|
||||||
#![feature(atomic_min_max)]
|
|
||||||
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};
|
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};
|
||||||
|
|
||||||
let foo = ", stringify!($atomic_type), "::new(23);
|
let foo = ", stringify!($atomic_type), "::new(23);
|
||||||
@@ -1951,9 +1945,7 @@ let min_foo = foo.fetch_min(bar, Ordering::SeqCst).min(bar);
|
|||||||
assert_eq!(min_foo, 12);
|
assert_eq!(min_foo, 12);
|
||||||
```"),
|
```"),
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "atomic_min_max",
|
#[stable(feature = "atomic_min_max", since = "1.45.0")]
|
||||||
reason = "easier and faster min/max than writing manual CAS loop",
|
|
||||||
issue = "48655")]
|
|
||||||
#[$cfg_cas]
|
#[$cfg_cas]
|
||||||
pub fn fetch_min(&self, val: $int_type, order: Ordering) -> $int_type {
|
pub fn fetch_min(&self, val: $int_type, order: Ordering) -> $int_type {
|
||||||
// SAFETY: data races are prevented by atomic intrinsics.
|
// SAFETY: data races are prevented by atomic intrinsics.
|
||||||
|
|||||||
Reference in New Issue
Block a user