Skip to content

Commit f4c6b42

Browse files
committed
feat(perf_buffer): perf_buffer relies on traits rather than specific types
1 parent 5a64498 commit f4c6b42

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

libbpf-rs/src/perf_buffer.rs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,13 @@ use std::ptr::NonNull;
99
use std::slice;
1010
use std::time::Duration;
1111

12-
use crate::util;
1312
use crate::util::validate_bpf_ret;
1413
use crate::AsRawLibbpf;
1514
use crate::Error;
1615
use crate::ErrorExt as _;
17-
use crate::Map;
18-
use crate::MapCore as _;
1916
use crate::MapType;
2017
use crate::Result;
18+
use crate::{util, MapCore};
2119

2220
// Workaround for `trait_alias`
2321
// (https://doc.rust-lang.org/unstable-book/language-features/trait-alias.html)
@@ -44,16 +42,22 @@ impl Debug for CbStruct<'_> {
4442
}
4543

4644
/// Builds [`PerfBuffer`] instances.
47-
pub struct PerfBufferBuilder<'a, 'b> {
48-
map: &'a Map<'a>,
45+
pub struct PerfBufferBuilder<'a, 'b, M>
46+
where
47+
M: MapCore + AsFd,
48+
{
49+
map: &'a M,
4950
pages: usize,
5051
sample_cb: Option<Box<dyn SampleCb + 'b>>,
5152
lost_cb: Option<Box<dyn LostCb + 'b>>,
5253
}
5354

54-
impl<'a> PerfBufferBuilder<'a, '_> {
55-
/// Create a new `PerfBufferBuilder` using the provided `Map`.
56-
pub fn new(map: &'a Map<'a>) -> Self {
55+
impl<'a, M> PerfBufferBuilder<'a, '_, M>
56+
where
57+
M: MapCore + AsFd,
58+
{
59+
/// Create a new `PerfBufferBuilder` using the provided `MapCore + AsFd` trait.
60+
pub fn new(map: &'a M) -> Self {
5761
Self {
5862
map,
5963
pages: 64,
@@ -63,14 +67,17 @@ impl<'a> PerfBufferBuilder<'a, '_> {
6367
}
6468
}
6569

66-
impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
70+
impl<'a, 'b, M> PerfBufferBuilder<'a, 'b, M>
71+
where
72+
M: MapCore + AsFd,
73+
{
6774
/// Callback to run when a sample is received.
6875
///
6976
/// This callback provides a raw byte slice. You may find libraries such as
7077
/// [`plain`](https://crates.io/crates/plain) helpful.
7178
///
7279
/// Callback arguments are: `(cpu, data)`.
73-
pub fn sample_cb<NewCb: SampleCb + 'b>(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b> {
80+
pub fn sample_cb<NewCb: SampleCb + 'b>(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b, M> {
7481
PerfBufferBuilder {
7582
map: self.map,
7683
pages: self.pages,
@@ -82,7 +89,7 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
8289
/// Callback to run when a sample is received.
8390
///
8491
/// Callback arguments are: `(cpu, lost_count)`.
85-
pub fn lost_cb<NewCb: LostCb + 'b>(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b> {
92+
pub fn lost_cb<NewCb: LostCb + 'b>(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b, M> {
8693
PerfBufferBuilder {
8794
map: self.map,
8895
pages: self.pages,
@@ -92,7 +99,7 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
9299
}
93100

94101
/// The number of pages to size the ring buffer.
95-
pub fn pages(self, pages: usize) -> PerfBufferBuilder<'a, 'b> {
102+
pub fn pages(self, pages: usize) -> PerfBufferBuilder<'a, 'b, M> {
96103
PerfBufferBuilder {
97104
map: self.map,
98105
pages,
@@ -164,7 +171,10 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
164171
}
165172
}
166173

167-
impl Debug for PerfBufferBuilder<'_, '_> {
174+
impl<M> Debug for PerfBufferBuilder<'_, '_, M>
175+
where
176+
M: MapCore + AsFd,
177+
{
168178
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
169179
let Self {
170180
map,
@@ -181,7 +191,7 @@ impl Debug for PerfBufferBuilder<'_, '_> {
181191
}
182192
}
183193

184-
/// Represents a special kind of [`Map`]. Typically used to transfer data between
194+
/// Represents a special kind of [`MapCore`]. Typically used to transfer data between
185195
/// [`Program`][crate::Program]s and userspace.
186196
#[derive(Debug)]
187197
pub struct PerfBuffer<'b> {

0 commit comments

Comments
 (0)