use super::{phase::GCPhase, stats::GCStats};
pub trait GCEventHandler: Send + Sync {
fn on_gc_start(&self, phase: GCPhase);
fn on_gc_end(&self, phase: GCPhase, stats: &GCStats);
fn on_object_collected(&self, size: usize);
}
#[derive(Debug, Clone, Copy)]
pub struct LoggingEventHandler {
pub verbose: bool,
}
impl LoggingEventHandler {
pub fn new() -> Self {
Self { verbose: false }
}
pub fn verbose() -> Self {
Self { verbose: true }
}
}
impl Default for LoggingEventHandler {
fn default() -> Self {
Self::new()
}
}
impl GCEventHandler for LoggingEventHandler {
fn on_gc_start(&self, phase: GCPhase) {
println!("[GC] Starting {:?} phase", phase);
}
fn on_gc_end(&self, phase: GCPhase, stats: &GCStats) {
println!(
"[GC] Completed {:?} phase - Collections: {}, Time: {}us",
phase, stats.collection_count, stats.last_collection_time_us
);
if self.verbose {
println!(
"[GC] Details - Marked: {}, Collected: {}, Bytes: {}",
stats.marked_objects, stats.collected_objects, stats.collected_bytes
);
}
}
fn on_object_collected(&self, size: usize) {
if self.verbose {
println!("[GC] Collected object of size {} bytes", size);
}
}
}
#[derive(Debug, Clone, Default)]
pub struct StatsCollectingEventHandler {
pub gc_start_count: usize,
pub gc_end_count: usize,
pub total_objects_collected: usize,
pub total_bytes_collected: usize,
}
impl StatsCollectingEventHandler {
pub fn new() -> Self {
Self::default()
}
pub fn reset(&mut self) {
self.gc_start_count = 0;
self.gc_end_count = 0;
self.total_objects_collected = 0;
self.total_bytes_collected = 0;
}
}
impl GCEventHandler for StatsCollectingEventHandler {
fn on_gc_start(&self, _phase: GCPhase) {
}
fn on_gc_end(&self, _phase: GCPhase, _stats: &GCStats) {
}
fn on_object_collected(&self, size: usize) {
let _ = size;
}
}