use cubecl_common::{
backtrace::BackTrace,
profile::{Instant, ProfileDuration},
};
use hashbrown::HashMap;
use crate::server::{ProfileError, ProfilingToken};
#[derive(Default, Debug)]
pub struct TimestampProfiler {
state: HashMap<ProfilingToken, State>,
counter: u64,
}
#[derive(Debug)]
enum State {
Start(Instant),
Error(ProfileError),
}
impl TimestampProfiler {
pub fn is_empty(&self) -> bool {
self.state.is_empty()
}
pub fn start(&mut self) -> ProfilingToken {
let token = ProfilingToken { id: self.counter };
self.counter += 1;
self.state.insert(token, State::Start(Instant::now()));
token
}
pub fn stop(&mut self, token: ProfilingToken) -> Result<ProfileDuration, ProfileError> {
let state = self.state.remove(&token);
let start = match state {
Some(val) => match val {
State::Start(instant) => instant,
State::Error(profile_error) => return Err(profile_error),
},
None => {
return Err(ProfileError::NotRegistered {
backtrace: BackTrace::capture(),
});
}
};
Ok(ProfileDuration::new_system_time(start, Instant::now()))
}
pub fn error(&mut self, error: ProfileError) {
self.state
.iter_mut()
.for_each(|(_, state)| *state = State::Error(error.clone()));
}
}