#[cfg(feature = "std")]
use std::time::{Duration, Instant};
use super::pool::MemoryPool;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ResetStrategy {
OperationCount(usize),
MemoryThreshold(usize),
#[cfg(feature = "std")]
TimeInterval(Duration),
PressureRatio(f64),
Hybrid,
Manual,
}
impl Default for ResetStrategy {
fn default() -> Self {
Self::Hybrid
}
}
#[derive(Debug)]
pub struct SmartArenaManager {
pool: MemoryPool,
strategy: ResetStrategy,
#[cfg(feature = "std")]
last_evaluation: Instant,
}
impl SmartArenaManager {
pub fn new(strategy: ResetStrategy) -> Self {
Self {
pool: MemoryPool::new(),
strategy,
#[cfg(feature = "std")]
last_evaluation: Instant::now(),
}
}
pub fn evaluate_reset_strategy(&mut self) -> bool {
match self.strategy {
ResetStrategy::OperationCount(threshold) => {
if self.pool.ops_since_reset >= threshold {
self.pool.force_cleanup();
true
} else {
false
}
}
ResetStrategy::MemoryThreshold(threshold) => {
if self.pool.stats.memory_in_use >= threshold {
self.pool.force_cleanup();
true
} else {
false
}
}
#[cfg(feature = "std")]
ResetStrategy::TimeInterval(interval) => {
if self.last_evaluation.elapsed() >= interval {
self.pool.force_cleanup();
self.last_evaluation = Instant::now();
true
} else {
false
}
}
ResetStrategy::PressureRatio(ratio) => {
if self.pool.is_under_memory_pressure() {
let current_ratio = self.pool.stats.memory_in_use as f64
/ self.pool.config.max_arena_size as f64;
if current_ratio >= ratio {
self.pool.force_cleanup();
return true;
}
}
false
}
ResetStrategy::Hybrid => {
let should_reset = self.pool.ops_since_reset >= 1000
|| self.pool.is_under_memory_pressure()
|| self.pool.should_perform_gc();
if should_reset {
self.pool.collect_garbage();
true
} else {
false
}
}
ResetStrategy::Manual => false, }
}
#[must_use]
pub fn pool(&self) -> &MemoryPool {
&self.pool
}
pub fn pool_mut(&mut self) -> &mut MemoryPool {
self.evaluate_reset_strategy();
&mut self.pool
}
pub fn set_strategy(&mut self, strategy: ResetStrategy) {
self.strategy = strategy;
}
#[must_use]
pub const fn strategy(&self) -> ResetStrategy {
self.strategy
}
}