Skip to main content

kovan_queue/
utils.rs

1use std::ops::{Deref, DerefMut};
2
3// Cache line sizes per architecture.
4// x86/x86_64: 64B, aarch64: 128B (Apple M-series / Neoverse), s390x: 256B.
5// Fallback: 64B (most common).
6
7// s390 - 256
8#[cfg(target_arch = "s390x")]
9#[repr(align(256))]
10#[derive(Copy, Clone, Default, Debug)]
11pub struct CacheAligned<T> {
12    pub data: T,
13}
14
15// neoverse 128 - Apple M-series
16// rest 64
17#[cfg(target_arch = "aarch64")]
18#[repr(align(128))]
19#[derive(Copy, Clone, Default, Debug)]
20pub struct CacheAligned<T> {
21    pub data: T,
22}
23
24// x86_64
25#[cfg(not(any(target_arch = "s390x", target_arch = "aarch64")))]
26#[repr(align(64))]
27#[derive(Copy, Clone, Default, Debug)]
28pub struct CacheAligned<T> {
29    pub data: T,
30}
31
32impl<T> Deref for CacheAligned<T> {
33    type Target = T;
34
35    fn deref(&self) -> &T {
36        &self.data
37    }
38}
39
40impl<T> DerefMut for CacheAligned<T> {
41    fn deref_mut(&mut self) -> &mut T {
42        &mut self.data
43    }
44}
45
46impl<T> CacheAligned<T> {
47    pub fn new(t: T) -> Self {
48        Self { data: t }
49    }
50}