use std::io;
use std::os::raw::c_int;
use perf_event_open_sys as sys;
use perf_event_open_sys::bindings::perf_event_attr;
pub unsafe fn setup_perf_event(cpu: i32, sample_freq: u64) -> Result<c_int, io::Error> {
let mut attrs: perf_event_attr = perf_event_open_sys::bindings::perf_event_attr {
size: std::mem::size_of::<sys::bindings::perf_event_attr>() as u32,
type_: sys::bindings::PERF_TYPE_SOFTWARE,
config: sys::bindings::PERF_COUNT_SW_CPU_CLOCK as u64,
..Default::default()
};
attrs.__bindgen_anon_1.sample_freq = sample_freq;
attrs.set_disabled(1);
attrs.set_freq(1);
let ret = unsafe {
sys::perf_event_open(
&mut attrs, -1,
cpu, -1,
0,
)
} as c_int;
if ret < 0 {
return Err(io::Error::last_os_error());
}
Ok(ret)
}