mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-09-25 12:00:35 +00:00
chore: move conditional AtomicU64 impl to new file (#5256)
Keeping the implementation out of a macro lets rustfmt apply to it.
This commit is contained in:
parent
d1b789f33a
commit
2be71ad746
@ -1,4 +1,5 @@
|
|||||||
[build.env]
|
[build.env]
|
||||||
passthrough = [
|
passthrough = [
|
||||||
"RUSTFLAGS",
|
"RUSTFLAGS",
|
||||||
|
"RUST_BACKTRACE",
|
||||||
]
|
]
|
||||||
|
@ -11,76 +11,8 @@ cfg_has_atomic_u64! {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cfg_not_has_atomic_u64! {
|
cfg_not_has_atomic_u64! {
|
||||||
use crate::loom::sync::Mutex;
|
#[path = "atomic_u64_as_mutex.rs"]
|
||||||
use std::sync::atomic::Ordering;
|
mod atomic_u64_as_mutex;
|
||||||
|
|
||||||
#[derive(Debug)]
|
pub(crate) use atomic_u64_as_mutex::AtomicU64;
|
||||||
pub(crate) struct AtomicU64 {
|
|
||||||
inner: Mutex<u64>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AtomicU64 {
|
|
||||||
pub(crate) fn new(val: u64) -> Self {
|
|
||||||
Self {
|
|
||||||
inner: Mutex::new(val),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn load(&self, _: Ordering) -> u64 {
|
|
||||||
*self.inner.lock()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn store(&self, val: u64, _: Ordering) {
|
|
||||||
*self.inner.lock() = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn fetch_add(&self, val: u64, _: Ordering) -> u64 {
|
|
||||||
let mut lock = self.inner.lock();
|
|
||||||
let prev = *lock;
|
|
||||||
*lock = prev + val;
|
|
||||||
prev
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn fetch_or(&self, val: u64, _: Ordering) -> u64 {
|
|
||||||
let mut lock = self.inner.lock();
|
|
||||||
let prev = *lock;
|
|
||||||
*lock = prev | val;
|
|
||||||
prev
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn compare_exchange(
|
|
||||||
&self,
|
|
||||||
current: u64,
|
|
||||||
new: u64,
|
|
||||||
_success: Ordering,
|
|
||||||
_failure: Ordering,
|
|
||||||
) -> Result<u64, u64> {
|
|
||||||
let mut lock = self.inner.lock();
|
|
||||||
|
|
||||||
if *lock == current {
|
|
||||||
*lock = new;
|
|
||||||
Ok(current)
|
|
||||||
} else {
|
|
||||||
Err(*lock)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn compare_exchange_weak(
|
|
||||||
&self,
|
|
||||||
current: u64,
|
|
||||||
new: u64,
|
|
||||||
success: Ordering,
|
|
||||||
failure: Ordering,
|
|
||||||
) -> Result<u64, u64> {
|
|
||||||
self.compare_exchange(current, new, success, failure)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for AtomicU64 {
|
|
||||||
fn default() -> AtomicU64 {
|
|
||||||
Self {
|
|
||||||
inner: Mutex::new(0),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
70
tokio/src/loom/std/atomic_u64_as_mutex.rs
Normal file
70
tokio/src/loom/std/atomic_u64_as_mutex.rs
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
use crate::loom::sync::Mutex;
|
||||||
|
use std::sync::atomic::Ordering;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub(crate) struct AtomicU64 {
|
||||||
|
inner: Mutex<u64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AtomicU64 {
|
||||||
|
pub(crate) fn new(val: u64) -> Self {
|
||||||
|
Self {
|
||||||
|
inner: Mutex::new(val),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn load(&self, _: Ordering) -> u64 {
|
||||||
|
*self.inner.lock()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn store(&self, val: u64, _: Ordering) {
|
||||||
|
*self.inner.lock() = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn fetch_add(&self, val: u64, _: Ordering) -> u64 {
|
||||||
|
let mut lock = self.inner.lock();
|
||||||
|
let prev = *lock;
|
||||||
|
*lock = prev + val;
|
||||||
|
prev
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn fetch_or(&self, val: u64, _: Ordering) -> u64 {
|
||||||
|
let mut lock = self.inner.lock();
|
||||||
|
let prev = *lock;
|
||||||
|
*lock = prev | val;
|
||||||
|
prev
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn compare_exchange(
|
||||||
|
&self,
|
||||||
|
current: u64,
|
||||||
|
new: u64,
|
||||||
|
_success: Ordering,
|
||||||
|
_failure: Ordering,
|
||||||
|
) -> Result<u64, u64> {
|
||||||
|
let mut lock = self.inner.lock();
|
||||||
|
|
||||||
|
if *lock == current {
|
||||||
|
*lock = new;
|
||||||
|
Ok(current)
|
||||||
|
} else {
|
||||||
|
Err(*lock)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn compare_exchange_weak(
|
||||||
|
&self,
|
||||||
|
current: u64,
|
||||||
|
new: u64,
|
||||||
|
success: Ordering,
|
||||||
|
failure: Ordering,
|
||||||
|
) -> Result<u64, u64> {
|
||||||
|
self.compare_exchange(current, new, success, failure)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for AtomicU64 {
|
||||||
|
fn default() -> AtomicU64 {
|
||||||
|
AtomicU64::new(u64::default())
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user