Skip to content

Commit 3fc706b

Browse files
CoderPoetd-e-s-o
authored andcommitted
feat(perf_buffer): perf_buffer relies on traits rather than specific types
1 parent af2ee0b commit 3fc706b

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

libbpf-rs/src/perf_buffer.rs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ use crate::util::validate_bpf_ret;
1414
use crate::AsRawLibbpf;
1515
use crate::Error;
1616
use crate::ErrorExt as _;
17-
use crate::Map;
18-
use crate::MapCore as _;
17+
use crate::MapCore;
1918
use crate::MapType;
2019
use crate::Result;
2120

@@ -44,16 +43,22 @@ impl Debug for CbStruct<'_> {
4443
}
4544

4645
/// Builds [`PerfBuffer`] instances.
47-
pub struct PerfBufferBuilder<'a, 'b> {
48-
map: &'a Map<'a>,
46+
pub struct PerfBufferBuilder<'a, 'b, M>
47+
where
48+
M: MapCore + AsFd,
49+
{
50+
map: &'a M,
4951
pages: usize,
5052
sample_cb: Option<Box<dyn SampleCb + 'b>>,
5153
lost_cb: Option<Box<dyn LostCb + 'b>>,
5254
}
5355

54-
impl<'a> PerfBufferBuilder<'a, '_> {
55-
/// Create a new `PerfBufferBuilder` using the provided `Map`.
56-
pub fn new(map: &'a Map<'a>) -> Self {
56+
impl<'a, M> PerfBufferBuilder<'a, '_, M>
57+
where
58+
M: MapCore + AsFd,
59+
{
60+
/// Create a new `PerfBufferBuilder` using the provided `MapCore + AsFd` trait.
61+
pub fn new(map: &'a M) -> Self {
5762
Self {
5863
map,
5964
pages: 64,
@@ -63,14 +68,17 @@ impl<'a> PerfBufferBuilder<'a, '_> {
6368
}
6469
}
6570

66-
impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
71+
impl<'a, 'b, M> PerfBufferBuilder<'a, 'b, M>
72+
where
73+
M: MapCore + AsFd,
74+
{
6775
/// Callback to run when a sample is received.
6876
///
6977
/// This callback provides a raw byte slice. You may find libraries such as
7078
/// [`plain`](https://crates.io/crates/plain) helpful.
7179
///
7280
/// Callback arguments are: `(cpu, data)`.
73-
pub fn sample_cb<NewCb: SampleCb + 'b>(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b> {
81+
pub fn sample_cb<NewCb: SampleCb + 'b>(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b, M> {
7482
PerfBufferBuilder {
7583
map: self.map,
7684
pages: self.pages,
@@ -82,7 +90,7 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
8290
/// Callback to run when a sample is received.
8391
///
8492
/// Callback arguments are: `(cpu, lost_count)`.
85-
pub fn lost_cb<NewCb: LostCb + 'b>(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b> {
93+
pub fn lost_cb<NewCb: LostCb + 'b>(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b, M> {
8694
PerfBufferBuilder {
8795
map: self.map,
8896
pages: self.pages,
@@ -92,7 +100,7 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
92100
}
93101

94102
/// The number of pages to size the ring buffer.
95-
pub fn pages(self, pages: usize) -> PerfBufferBuilder<'a, 'b> {
103+
pub fn pages(self, pages: usize) -> PerfBufferBuilder<'a, 'b, M> {
96104
PerfBufferBuilder {
97105
map: self.map,
98106
pages,
@@ -164,7 +172,10 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
164172
}
165173
}
166174

167-
impl Debug for PerfBufferBuilder<'_, '_> {
175+
impl<M> Debug for PerfBufferBuilder<'_, '_, M>
176+
where
177+
M: MapCore + AsFd,
178+
{
168179
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
169180
let Self {
170181
map,
@@ -181,7 +192,7 @@ impl Debug for PerfBufferBuilder<'_, '_> {
181192
}
182193
}
183194

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

0 commit comments

Comments
 (0)