use super::*;
pub(crate) fn disable_counter(ptc: &Arc<PerTaskCounter>) -> crate::StarryResult<()> {
ptc.enabled.store(false, Ordering::Release);
let action = ptc.run_state.lock().begin_disable();
let result = match action {
PmuCloseAction::AlreadyClosed | PmuCloseAction::Complete => {
ptc.finish_enabled_context(now_ns());
Ok(())
}
PmuCloseAction::Stop(lease) => cpu_worker::stop_task_counter(Arc::clone(ptc), lease),
};
if result.is_ok() {
ptc.publish_rdpmc_inactive();
}
result
}
pub(crate) fn reset_counter(ptc: &Arc<PerTaskCounter>) -> crate::StarryResult<()> {
let was_enabled = ptc.enabled.swap(false, Ordering::AcqRel);
if let Err(error) = disable_counter(ptc) {
if was_enabled {
ptc.set_enabled();
}
return Err(error);
}
ptc.accumulated.store(0, Ordering::Release);
ptc.sample_read_floor.store(0, Ordering::Release);
ptc.counting_extender.lock().reset();
ptc.publish_rdpmc_inactive();
if was_enabled && !ptc.resources_released() {
ptc.set_enabled();
ptc.synchronize_context()?;
}
Ok(())
}