diff options
| author | Dylan DPC <99973273+Dylan-DPC@users.noreply.github.com> | 2022-06-29 17:59:32 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-29 17:59:32 +0530 |
| commit | 3f2ba251591410016a1e056c6cdafc30c965db29 (patch) | |
| tree | 9fdd5b6f42733d88d883a864553b675ae56dbab0 | |
| parent | d10497bba2b257162ad10ddeb729341c72f58c2f (diff) | |
| parent | 9c5ae20c5952824614a3d2c67a467f2c0d0d9d86 (diff) | |
| download | rust-3f2ba251591410016a1e056c6cdafc30c965db29.tar.gz rust-3f2ba251591410016a1e056c6cdafc30c965db29.zip | |
Rollup merge of #98479 - leocth:atomic-bool-fetch-not, r=joshtriplett
Add `fetch_not` method on `AtomicBool` This PR adds a `fetch_not` method on `AtomicBool` performs the NOT operation on the inner value. Internally, this just calls the `fetch_xor` method with the value `true`. [See this IRLO discussion](https://internals.rust-lang.org/t/could-we-have-fetch-not-for-atomicbool-s/16881)
| -rw-r--r-- | library/core/src/sync/atomic.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/library/core/src/sync/atomic.rs b/library/core/src/sync/atomic.rs index a68c6080e3a..90e2dfd5d3d 100644 --- a/library/core/src/sync/atomic.rs +++ b/library/core/src/sync/atomic.rs @@ -854,6 +854,42 @@ impl AtomicBool { unsafe { atomic_xor(self.v.get(), val as u8, order) != 0 } } + /// Logical "not" with a boolean value. + /// + /// Performs a logical "not" operation on the current value, and sets + /// the new value to the result. + /// + /// Returns the previous value. + /// + /// `fetch_not` takes an [`Ordering`] argument which describes the memory ordering + /// of this operation. All ordering modes are possible. Note that using + /// [`Acquire`] makes the store part of this operation [`Relaxed`], and + /// using [`Release`] makes the load part [`Relaxed`]. + /// + /// **Note:** This method is only available on platforms that support atomic + /// operations on `u8`. + /// + /// # Examples + /// + /// ``` + /// #![feature(atomic_bool_fetch_not)] + /// use std::sync::atomic::{AtomicBool, Ordering}; + /// + /// let foo = AtomicBool::new(true); + /// assert_eq!(foo.fetch_not(Ordering::SeqCst), true); + /// assert_eq!(foo.load(Ordering::SeqCst), false); + /// + /// let foo = AtomicBool::new(false); + /// assert_eq!(foo.fetch_not(Ordering::SeqCst), false); + /// assert_eq!(foo.load(Ordering::SeqCst), true); + /// ``` + #[inline] + #[unstable(feature = "atomic_bool_fetch_not", issue = "98485")] + #[cfg(target_has_atomic = "8")] + pub fn fetch_not(&self, order: Ordering) -> bool { + self.fetch_xor(true, order) + } + /// Returns a mutable pointer to the underlying [`bool`]. /// /// Doing non-atomic reads and writes on the resulting integer can be a data race. |
