use mnemosyne_core::NUM_SIZE_CLASSES;
use crate::{LocalAllocatorSelector, SizeClassOccupancy};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct MemoryStats {
pub current_mapped_bytes: usize,
pub peak_mapped_bytes: usize,
pub map_calls: usize,
pub unmap_calls: usize,
pub page_reset_calls: usize,
pub page_reset_bytes: usize,
pub guard_install_calls: usize,
pub guard_install_bytes: usize,
pub retained_free_segments: usize,
pub max_retained_free_segments: usize,
pub retained_free_bytes: usize,
pub purged_segments: usize,
pub purge_calls: usize,
pub purged_bytes: usize,
pub reset_segments: usize,
pub reset_calls: usize,
pub retained_huge_blocks: usize,
pub retained_huge_bytes: usize,
pub current_thread_live_allocations: usize,
pub current_thread_owned_segments: usize,
pub cross_thread_reclaimed_blocks: usize,
pub page_refills: usize,
pub recycled_pages: usize,
pub fresh_pages: usize,
pub fresh_segments: usize,
pub orphan_segments_adopted: usize,
pub recycle_sweeps: usize,
pub size_class_occupancy: [SizeClassOccupancy; NUM_SIZE_CLASSES],
}
impl Default for MemoryStats {
fn default() -> Self {
Self {
current_mapped_bytes: 0,
peak_mapped_bytes: 0,
map_calls: 0,
unmap_calls: 0,
page_reset_calls: 0,
page_reset_bytes: 0,
guard_install_calls: 0,
guard_install_bytes: 0,
retained_free_segments: 0,
max_retained_free_segments: 0,
retained_free_bytes: 0,
purged_segments: 0,
purge_calls: 0,
purged_bytes: 0,
reset_segments: 0,
reset_calls: 0,
retained_huge_blocks: 0,
retained_huge_bytes: 0,
current_thread_live_allocations: 0,
current_thread_owned_segments: 0,
cross_thread_reclaimed_blocks: 0,
page_refills: 0,
recycled_pages: 0,
fresh_pages: 0,
fresh_segments: 0,
orphan_segments_adopted: 0,
recycle_sweeps: 0,
size_class_occupancy: [SizeClassOccupancy::default(); NUM_SIZE_CLASSES],
}
}
}
pub fn memory_stats_generic<B: mnemosyne_arena::HasSegmentPool + LocalAllocatorSelector<B>>()
-> MemoryStats {
let backend = mnemosyne_backend::backend_memory_stats();
let arena = mnemosyne_arena::arena_memory_stats::<B>();
let local = mnemosyne_local::thread_allocator_stats::<B>();
MemoryStats {
current_mapped_bytes: backend.current_mapped_bytes,
peak_mapped_bytes: backend.peak_mapped_bytes,
map_calls: backend.map_calls,
unmap_calls: backend.unmap_calls,
page_reset_calls: backend.page_reset_calls,
page_reset_bytes: backend.page_reset_bytes,
guard_install_calls: backend.guard_install_calls,
guard_install_bytes: backend.guard_install_bytes,
retained_free_segments: arena.retained_free_segments,
max_retained_free_segments: arena.max_retained_free_segments,
retained_free_bytes: arena.retained_free_bytes,
purged_segments: arena.purged_segments,
purge_calls: arena.purge_calls,
purged_bytes: arena.purged_bytes,
reset_segments: arena.reset_segments,
reset_calls: arena.reset_calls,
retained_huge_blocks: arena.retained_huge_blocks,
retained_huge_bytes: arena.retained_huge_bytes,
current_thread_live_allocations: local.current_thread_live_allocations,
current_thread_owned_segments: local.current_thread_owned_segments,
cross_thread_reclaimed_blocks: local.cross_thread_reclaimed_blocks,
page_refills: local.page_refills,
recycled_pages: local.recycled_pages,
fresh_pages: local.fresh_pages,
fresh_segments: local.fresh_segments,
orphan_segments_adopted: local.orphan_segments_adopted,
recycle_sweeps: local.recycle_sweeps,
size_class_occupancy: local.size_class_occupancy,
}
}
pub fn memory_stats() -> MemoryStats {
memory_stats_generic::<mnemosyne_backend::MemoryBackendWrapper>()
}
pub fn purge_generic<B: mnemosyne_arena::HasSegmentPool>() {
unsafe {
mnemosyne_arena::purge_segment_pool::<B>();
}
}
pub fn purge() {
purge_generic::<mnemosyne_backend::MemoryBackendWrapper>();
}
pub fn reset_generic<B: mnemosyne_arena::HasSegmentPool>() {
unsafe {
mnemosyne_arena::reset_segment_pool::<B>();
}
}
pub fn reset() {
reset_generic::<mnemosyne_backend::MemoryBackendWrapper>();
}
pub fn decay() {
mnemosyne_decay::decay_step();
}