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, 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}