use std::io::Result;
use super::{
ExtraRecord, Inherit, OnExecve, Priv, RecordIdFormat, SampleFormat, SampleOn, SampleSkid,
SigData, WakeUp,
};
use crate::ffi::bindings as b;
pub(crate) mod attr;
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Opts {
pub exclude: Priv,
pub inherit: Option<Inherit>,
pub on_execve: Option<OnExecve>,
pub stat_format: StatFormat,
pub enable: bool,
pub sample_on: SampleOn,
pub sample_skid: SampleSkid,
pub sample_format: SampleFormat,
pub extra_record: ExtraRecord,
pub record_id_all: bool,
pub record_id_format: RecordIdFormat,
pub wake_up: WakeUp,
pub aux_output: bool,
pub on_sample: OnSample,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StatFormat {
pub id: bool,
pub time_enabled: bool,
pub time_running: bool,
pub lost_records: bool,
}
impl StatFormat {
pub(crate) fn as_read_format(&self) -> Result<u64> {
let mut val = 0;
macro_rules! when {
($field:ident, $flag:ident) => {
if self.$field {
val |= b::$flag;
}
};
}
when!(id, PERF_FORMAT_ID);
when!(time_enabled, PERF_FORMAT_TOTAL_TIME_ENABLED);
when!(time_running, PERF_FORMAT_TOTAL_TIME_RUNNING);
#[cfg(feature = "linux-6.0")]
when!(lost_records, PERF_FORMAT_LOST);
#[cfg(not(feature = "linux-6.0"))]
crate::config::unsupported!(self.lost_records);
Ok(val as _)
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct OnSample {
pub aux: Option<AuxTracer>,
pub sigtrap: Option<SigData>,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum AuxTracer {
Pause,
Resume,
}