#[cfg(feature = "std")]
use std::time::Instant;
use super::pool::MemoryPool;
impl MemoryPool {
pub(super) fn check_reset_conditions(&mut self) {
let should_reset = self.ops_since_reset >= self.config.reset_threshold
|| self.is_under_memory_pressure()
|| self.should_perform_gc();
if should_reset {
#[cfg(feature = "arena")]
self.reset_primary_arena();
}
}
pub(super) fn is_under_memory_pressure(&self) -> bool {
if self.config.max_arena_size == 0 {
return false;
}
let pressure_ratio = self.stats.memory_in_use as f64 / self.config.max_arena_size as f64;
pressure_ratio > self.config.pressure_threshold
}
pub(super) fn should_perform_gc(&self) -> bool {
if !self.config.auto_gc {
return false;
}
#[cfg(feature = "std")]
{
if let Some(last_gc) = self.last_gc {
if last_gc.elapsed() < self.config.min_gc_interval {
return false;
}
}
}
if self.memory_at_last_gc > 0 {
let growth_ratio = self.stats.memory_in_use as f64 / self.memory_at_last_gc as f64;
growth_ratio > self.config.growth_rate_threshold
} else {
self.stats.memory_in_use > self.config.max_arena_size / 2
}
}
pub fn collect_garbage(&mut self) -> usize {
let memory_before = self.stats.memory_in_use;
#[cfg(feature = "arena")]
self.reset_temp_arena();
if self.is_under_memory_pressure() {
#[cfg(feature = "arena")]
self.reset_primary_arena();
}
self.stats.gc_cycles += 1;
#[cfg(feature = "std")]
{
self.last_gc = Some(Instant::now());
}
self.memory_at_last_gc = self.stats.memory_in_use;
memory_before.saturating_sub(self.stats.memory_in_use)
}
pub(super) fn update_memory_stats(&mut self) {
#[cfg(feature = "arena")]
{
let estimated_primary = self.primary_arena.allocated_bytes();
let estimated_temp = self.temp_arena.allocated_bytes();
self.stats.memory_in_use = estimated_primary + estimated_temp;
self.stats.total_allocated = self.stats.memory_in_use;
if self.stats.memory_in_use > self.stats.peak_memory {
self.stats.peak_memory = self.stats.memory_in_use;
}
}
}
pub fn force_cleanup(&mut self) {
#[cfg(feature = "arena")]
self.reset_all_arenas();
self.ops_since_reset = 0;
self.memory_at_last_gc = 0;
#[cfg(feature = "std")]
{
self.last_gc = Some(Instant::now());
}
self.update_memory_stats();
}
}