#[must_use]
pub fn policy_summary() -> alloc::string::String {
use alloc::format;
use mnemosyne_core::policy::AllocPolicy;
let stats = mnemosyne_local::summary_line();
format!(
"policy={} mitigations=0x{:08X} fingerprint=0x{:016X} {stats}",
mnemosyne_core::policy::StandardPolicy::POLICY_NAME,
mnemosyne_core::policy::StandardPolicy::MITIGATION_FLAGS,
mnemosyne_core::policy::StandardPolicy::POLICY_FINGERPRINT,
)
}
#[must_use]
pub fn top_n_classes(n: usize) -> alloc::vec::Vec<mnemosyne_local::BinSnapshot> {
let mut snapshots: alloc::vec::Vec<_> = mnemosyne_local::all_bin_snapshots()
.into_iter()
.filter(|s| s.alloc_count > 0)
.collect();
snapshots.sort_unstable_by_key(|s| core::cmp::Reverse(s.alloc_count));
snapshots.truncate(n);
snapshots
}
pub struct BinStatsWindow {
bins: [mnemosyne_local::BinSnapshot; mnemosyne_core::NUM_SIZE_CLASSES],
}
impl BinStatsWindow {
#[must_use]
pub fn capture() -> Self {
Self {
bins: mnemosyne_local::all_bin_snapshots(),
}
}
#[must_use]
pub fn delta(&self) -> [mnemosyne_local::BinSnapshot; mnemosyne_core::NUM_SIZE_CLASSES] {
let now = mnemosyne_local::all_bin_snapshots();
core::array::from_fn(|class| {
let b = &self.bins[class];
let n = &now[class];
n.saturating_delta(b)
})
}
#[inline(always)]
fn sum_delta_field(&self, f: impl Fn(&mnemosyne_local::BinSnapshot) -> u64) -> u64 {
self.delta().iter().map(f).fold(0u64, u64::saturating_add)
}
#[must_use]
pub fn total_alloc_count_delta(&self) -> u64 {
self.sum_delta_field(|s| s.alloc_count)
}
#[must_use]
pub fn total_live_bytes_delta(&self) -> u64 {
self.sum_delta_field(|s| s.live_bytes())
}
#[must_use]
pub fn total_requested_bytes_delta(&self) -> u64 {
self.sum_delta_field(|s| s.requested_bytes)
}
#[must_use]
pub fn window_internal_fragmentation(&self) -> f64 {
let d = self.delta();
let alloc: u64 = d.iter().map(|s| s.alloc_bytes).fold(0, u64::saturating_add);
let req: u64 = d
.iter()
.map(|s| s.requested_bytes)
.fold(0, u64::saturating_add);
if alloc == 0 || req == 0 {
return 0.0;
}
let waste = alloc.saturating_sub(req);
(waste as f64 / alloc as f64).min(1.0)
}
}