use crate::core::BPF;
use crate::error::BccError;
use crate::perf_event::Event;
#[derive(Default)]
pub struct PerfEventArray {
table: Option<String>,
event: Option<Event>,
cpu: Option<usize>,
}
impl PerfEventArray {
pub fn new() -> Self {
Default::default()
}
pub fn table(mut self, name: &str) -> Self {
self.table = Some(name.to_owned());
self
}
pub fn event(mut self, event: Event) -> Self {
self.event = Some(event);
self
}
pub fn cpu(mut self, cpu: Option<usize>) -> Self {
self.cpu = cpu;
self
}
pub fn attach(self, bpf: &mut BPF) -> Result<(), BccError> {
if self.event.is_none() {
return Err(BccError::InvalidPerfEvent {
message: "event is required".to_string(),
});
}
if self.table.is_none() {
return Err(BccError::InvalidPerfEvent {
message: "table is required".to_string(),
});
}
let table = self.table.unwrap();
let event = self.event.unwrap();
let table_fd = bpf.table_fd(&table)?;
let ev_type = event.ev_type();
let ev_config = event.ev_config();
let mut event_array = crate::core::PerfEventArray::new(table, ev_type, ev_config, table_fd);
event_array
.open_all_cpu()
.map_err(|e| BccError::OpenPerfEvent { event, message: e })?;
bpf.perf_events_array.insert(event_array);
Ok(())
}
}