region_cached 0.0.3

Add a layer of cache between L3 and main memory
Documentation
#[cfg(test)]
use std::sync::Arc;

use many_cpus::{HardwareTracker, MemoryRegionId};

#[cfg_attr(test, mockall::automock)]
pub(crate) trait HardwareTrackerClient {
    fn current_memory_region_id(&self) -> MemoryRegionId;
    fn is_thread_memory_region_pinned(&self) -> bool;
}

#[derive(Debug)]
pub(crate) struct HardwareTrackerClientImpl;

impl HardwareTrackerClient for HardwareTrackerClientImpl {
    fn current_memory_region_id(&self) -> MemoryRegionId {
        HardwareTracker::with(|tracker| tracker.current_memory_region_id())
    }

    fn is_thread_memory_region_pinned(&self) -> bool {
        HardwareTracker::with(|tracker| tracker.is_thread_memory_region_pinned())
    }
}

#[derive(Clone, Debug)]
pub(crate) enum HardwareTrackerClientFacade {
    Real(&'static HardwareTrackerClientImpl),

    #[cfg(test)]
    Mock(Arc<MockHardwareTrackerClient>),
}

impl HardwareTrackerClientFacade {
    pub(crate) const fn real() -> Self {
        Self::Real(&HardwareTrackerClientImpl)
    }

    #[cfg(test)]
    pub(crate) fn from_mock(mock: MockHardwareTrackerClient) -> Self {
        Self::Mock(Arc::new(mock))
    }
}

impl HardwareTrackerClient for HardwareTrackerClientFacade {
    fn current_memory_region_id(&self) -> MemoryRegionId {
        match self {
            HardwareTrackerClientFacade::Real(real) => real.current_memory_region_id(),
            #[cfg(test)]
            HardwareTrackerClientFacade::Mock(mock) => mock.current_memory_region_id(),
        }
    }

    fn is_thread_memory_region_pinned(&self) -> bool {
        match self {
            HardwareTrackerClientFacade::Real(real) => real.is_thread_memory_region_pinned(),
            #[cfg(test)]
            HardwareTrackerClientFacade::Mock(mock) => mock.is_thread_memory_region_pinned(),
        }
    }
}