broker_tokio/loom/std/
atomic_u64.rs1pub(crate) use self::imp::AtomicU64;
6
7#[cfg(not(any(target_arch = "arm", target_arch = "mips", target_arch = "powerpc")))]
12mod imp {
13 pub(crate) use std::sync::atomic::AtomicU64;
14}
15
16#[cfg(any(target_arch = "arm", target_arch = "mips", target_arch = "powerpc"))]
17mod imp {
18 use std::sync::atomic::Ordering;
19 use std::sync::Mutex;
20
21 #[derive(Debug)]
22 pub(crate) struct AtomicU64 {
23 inner: Mutex<u64>,
24 }
25
26 impl AtomicU64 {
27 pub(crate) fn new(val: u64) -> AtomicU64 {
28 AtomicU64 {
29 inner: Mutex::new(val),
30 }
31 }
32
33 pub(crate) fn load(&self, _: Ordering) -> u64 {
34 *self.inner.lock().unwrap()
35 }
36
37 pub(crate) fn store(&self, val: u64, _: Ordering) {
38 *self.inner.lock().unwrap() = val;
39 }
40
41 pub(crate) fn fetch_or(&self, val: u64, _: Ordering) -> u64 {
42 let mut lock = self.inner.lock().unwrap();
43 let prev = *lock;
44 *lock = prev | val;
45 prev
46 }
47
48 pub(crate) fn compare_and_swap(&self, old: u64, new: u64, _: Ordering) -> u64 {
49 let mut lock = self.inner.lock().unwrap();
50 let prev = *lock;
51
52 if prev != old {
53 return prev;
54 }
55
56 *lock = new;
57 prev
58 }
59 }
60}