Skip to main content

miden_debug_engine/exec/
trace_monitor.rs

1use std::sync::{Arc, Mutex};
2
3use miden_processor::trace::RowIndex;
4
5/// Can be used with `DebugExecutor::step_until` to break on trace events
6#[derive(Default, Clone)]
7pub struct TraceMonitor(Arc<Mutex<TraceMonitorInner>>);
8
9#[derive(Default)]
10struct TraceMonitorInner {
11    events: Vec<(RowIndex, super::TraceEvent)>,
12}
13
14impl TraceMonitor {
15    pub fn handle_event(&self, clock: RowIndex, event: super::TraceEvent) {
16        let mut guard = self.0.lock().unwrap();
17        guard.events.push((clock, event));
18    }
19
20    pub fn has_any_event_occurred_since(&self, since_clock: RowIndex) -> bool {
21        let guard = self.0.lock().unwrap();
22        guard.events.iter().any(|(cycle, _)| *cycle >= since_clock)
23    }
24
25    pub fn has_event_occurred_since<F>(&self, since_cycle: RowIndex, predicate: F) -> bool
26    where
27        F: Fn(super::TraceEvent) -> bool,
28    {
29        let guard = self.0.lock().unwrap();
30        guard
31            .events
32            .iter()
33            .any(move |(cycle, event)| *cycle >= since_cycle && predicate(*event))
34    }
35}