bcc/perf_event/
mod.rs

1mod callback;
2mod events;
3#[allow(clippy::module_inception)]
4mod perf_event;
5mod perf_event_array;
6mod perf_map;
7mod perf_reader;
8
9use crate::perf_event::callback::raw_callback;
10use crate::types::MutPointer;
11pub use callback::*;
12pub use events::*;
13pub use perf_event::*;
14pub use perf_event_array::*;
15pub use perf_map::*;
16pub use perf_reader::*;
17
18use crate::BccError;
19
20use bcc_sys::bccapi::*;
21
22use std::sync::atomic::AtomicPtr;
23
24const BPF_PERF_READER_PAGE_CNT: i32 = 64;
25
26fn open_perf_buffer(
27    cpu: usize,
28    raw_cb: Box<dyn FnMut(&[u8]) + Send>,
29    page_count: i32,
30) -> Result<PerfReader, BccError> {
31    let callback = Box::new(PerfCallback::new(raw_cb));
32    let reader = unsafe {
33        bpf_open_perf_buffer(
34            Some(raw_callback),
35            None,
36            Box::into_raw(callback) as MutPointer,
37            -1, /* pid */
38            cpu as i32,
39            page_count,
40        )
41    };
42    if reader.is_null() {
43        return Err(BccError::OpenPerfBuffer);
44    }
45    Ok(PerfReader {
46        ptr: AtomicPtr::new(reader as *mut bcc_sys::bccapi::perf_reader),
47    })
48}