mod walk;
pub use walk::WalkTiming;
use vize_l0::profiler::global_profiler;
use super::{FailEvent, PassEvent, PassObserver, Pipeline};
#[derive(Debug)]
pub struct TimingObserver {
key: &'static str,
open: WalkTiming<vize_l0::profiler::Timer>,
pub recorded_walks: u32,
}
impl Default for TimingObserver {
fn default() -> Self {
Self::new()
}
}
impl TimingObserver {
pub const WALK_KEY: &'static str = "davinci.pass.walk";
#[must_use]
pub const fn new() -> Self {
Self::with_key(Self::WALK_KEY)
}
#[must_use]
pub const fn with_key(key: &'static str) -> Self {
Self {
key,
open: WalkTiming::new(),
recorded_walks: 0,
}
}
}
impl PassObserver for TimingObserver {
fn before_pipeline(&mut self, _pipeline: &Pipeline) {
self.open.discard();
}
fn before_pass(&mut self, event: &PassEvent<'_>) {
let key = self.key;
self.open.begin(event, || {
let profiler = global_profiler();
profiler.timer(key)
});
}
fn after_pass(&mut self, event: &PassEvent<'_>) {
if let Some((timer, attribution)) = self.open.end(event) {
let elapsed = timer.stop();
global_profiler().record_attributed(self.key, attribution, elapsed);
self.recorded_walks += 1;
}
}
fn on_fail(&mut self, _event: &FailEvent<'_>) {
self.open.discard();
}
}