cuneiform 0.1.1

Cache optimizations for Rust, revived from the slabs of Sumer.
Documentation
use super::CuneiformArgs;

#[cfg(target_os = "linux")]
use super::slabs::FALLBACK_COHERENCE_LINE_SIZE;
#[cfg(target_os = "linux")]
use std::fs;
#[cfg(target_os = "linux")]
use walkdir::WalkDir;

#[cfg(target_os = "linux")]
const LINUX_CPU_PROC_PROBE: &'static str = "/sys/devices/system/cpu/";
#[cfg(target_os = "linux")]
const CACHE_LINE_PROBE: &'static str = "coherency_line_size";

#[cfg(target_os = "linux")]
pub(crate) fn hermetic_detection(_args: CuneiformArgs) -> usize {
    let mut ways = Vec::<usize>::new();
    for entry in WalkDir::new(LINUX_CPU_PROC_PROBE)
        .into_iter()
        .filter_map(|e| e.ok())
        .filter(|e| e.path().ends_with(CACHE_LINE_PROBE))
    {
        let clps =
            fs::read_to_string(entry.path()).expect("Unexpected failure reading cache line probe");
        let clps = clps.trim();
        let clp = clps.parse::<usize>().unwrap();
        ways.push(clp);
    }

    ways.iter()
        .min()
        .map_or(FALLBACK_COHERENCE_LINE_SIZE as usize, |e| *e)
}

#[cfg(not(target_os = "linux"))]
pub(crate) fn hermetic_detection(args: CuneiformArgs) -> usize {
    super::slabs::slab_fetch(args) as usize
}

#[test]
fn hermetic_test() {
    let mut cargs = CuneiformArgs::new();
    cargs.with_hermetic(true);

    hermetic_detection(cargs);
}