use core::sync::atomic::{AtomicBool, AtomicUsize};
pub static MAX_RETAINED_SEGMENTS: AtomicUsize = AtomicUsize::new(default_max_retained_segments());
const fn default_max_retained_segments() -> usize {
if cfg!(miri) {
0
} else {
crate::constants::MAX_RETAINED_SEGMENTS_LIMIT
}
}
pub static ENABLE_HUGEPAGE_HINT: AtomicBool = AtomicBool::new(true);
pub static PURGE_CADENCE_MS: AtomicUsize = AtomicUsize::new(0);
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct MnemosyneOptions {
pub max_retained_segments: usize,
pub purge_cadence_ms: usize,
pub enable_hugepage_hint: bool,
}
impl Default for MnemosyneOptions {
#[inline]
fn default() -> Self {
Self {
max_retained_segments: default_max_retained_segments(),
purge_cadence_ms: 0,
enable_hugepage_hint: true,
}
}
}
#[inline]
pub fn get_options() -> MnemosyneOptions {
use core::sync::atomic::Ordering;
MnemosyneOptions {
max_retained_segments: MAX_RETAINED_SEGMENTS.load(Ordering::Acquire),
purge_cadence_ms: PURGE_CADENCE_MS.load(Ordering::Acquire),
enable_hugepage_hint: ENABLE_HUGEPAGE_HINT.load(Ordering::Acquire),
}
}
#[inline]
pub fn set_options(options: MnemosyneOptions) {
use core::sync::atomic::Ordering;
let clamped_retained = core::cmp::min(
options.max_retained_segments,
crate::constants::MAX_RETAINED_SEGMENTS_LIMIT,
);
MAX_RETAINED_SEGMENTS.store(clamped_retained, Ordering::Release);
PURGE_CADENCE_MS.store(options.purge_cadence_ms, Ordering::Release);
ENABLE_HUGEPAGE_HINT.store(options.enable_hugepage_hint, Ordering::Release);
}