Skip to main content

dualcache_ff/
cache_padded.rs

1use core::ops::{Deref, DerefMut};
2
3/// Cache-line-aligned wrapper to prevent false sharing between worker slots.
4///
5/// Replaces `crossbeam_utils::CachePadded` with zero external dependencies.
6/// Uses `#[repr(C, align(N))]` directly:
7/// - 128 bytes on Apple Silicon / ARM (128-byte cache line)
8/// -  64 bytes on x86_64 and everything else (64-byte cache line)
9#[cfg_attr(any(target_arch = "aarch64", target_arch = "arm"), repr(C, align(128)))]
10#[cfg_attr(not(any(target_arch = "aarch64", target_arch = "arm")), repr(C, align(64)))]
11pub struct CachePadded<T>(pub T);
12
13impl<T> CachePadded<T> {
14    #[inline(always)]
15    pub fn new(val: T) -> Self {
16        Self(val)
17    }
18
19    #[inline(always)]
20    pub fn into_inner(self) -> T {
21        self.0
22    }
23}
24
25impl<T> Deref for CachePadded<T> {
26    type Target = T;
27    #[inline(always)]
28    fn deref(&self) -> &T {
29        &self.0
30    }
31}
32
33impl<T> DerefMut for CachePadded<T> {
34    #[inline(always)]
35    fn deref_mut(&mut self) -> &mut T {
36        &mut self.0
37    }
38}