From 60bb0f093d219bd6b4bd885c8fb0d53e6c46cd9c Mon Sep 17 00:00:00 2001 From: CoderPoet Date: Thu, 12 Sep 2024 20:14:35 +0800 Subject: [PATCH] feat(perf_buffer): perf_buffer relies on traits rather than specific types --- libbpf-rs/src/perf_buffer.rs | 37 +++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/libbpf-rs/src/perf_buffer.rs b/libbpf-rs/src/perf_buffer.rs index 490683a4..ec2084d0 100644 --- a/libbpf-rs/src/perf_buffer.rs +++ b/libbpf-rs/src/perf_buffer.rs @@ -14,8 +14,7 @@ use crate::util::validate_bpf_ret; use crate::AsRawLibbpf; use crate::Error; use crate::ErrorExt as _; -use crate::Map; -use crate::MapCore as _; +use crate::MapCore; use crate::MapType; use crate::Result; @@ -44,16 +43,22 @@ impl Debug for CbStruct<'_> { } /// Builds [`PerfBuffer`] instances. -pub struct PerfBufferBuilder<'a, 'b> { - map: &'a Map<'a>, +pub struct PerfBufferBuilder<'a, 'b, M> +where + M: MapCore + AsFd, +{ + map: &'a M, pages: usize, sample_cb: Option>, lost_cb: Option>, } -impl<'a> PerfBufferBuilder<'a, '_> { - /// Create a new `PerfBufferBuilder` using the provided `Map`. - pub fn new(map: &'a Map<'a>) -> Self { +impl<'a, M> PerfBufferBuilder<'a, '_, M> +where + M: MapCore + AsFd, +{ + /// Create a new `PerfBufferBuilder` using the provided `MapCore + AsFd` trait. + pub fn new(map: &'a M) -> Self { Self { map, pages: 64, @@ -63,14 +68,17 @@ impl<'a> PerfBufferBuilder<'a, '_> { } } -impl<'a, 'b> PerfBufferBuilder<'a, 'b> { +impl<'a, 'b, M> PerfBufferBuilder<'a, 'b, M> +where + M: MapCore + AsFd, +{ /// Callback to run when a sample is received. /// /// This callback provides a raw byte slice. You may find libraries such as /// [`plain`](https://crates.io/crates/plain) helpful. /// /// Callback arguments are: `(cpu, data)`. - pub fn sample_cb(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b> { + pub fn sample_cb(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b, M> { PerfBufferBuilder { map: self.map, pages: self.pages, @@ -82,7 +90,7 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> { /// Callback to run when a sample is received. /// /// Callback arguments are: `(cpu, lost_count)`. - pub fn lost_cb(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b> { + pub fn lost_cb(self, cb: NewCb) -> PerfBufferBuilder<'a, 'b, M> { PerfBufferBuilder { map: self.map, pages: self.pages, @@ -92,7 +100,7 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> { } /// The number of pages to size the ring buffer. - pub fn pages(self, pages: usize) -> PerfBufferBuilder<'a, 'b> { + pub fn pages(self, pages: usize) -> PerfBufferBuilder<'a, 'b, M> { PerfBufferBuilder { map: self.map, pages, @@ -164,7 +172,10 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> { } } -impl Debug for PerfBufferBuilder<'_, '_> { +impl Debug for PerfBufferBuilder<'_, '_, M> +where + M: MapCore + AsFd, +{ fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { let Self { map, @@ -181,7 +192,7 @@ impl Debug for PerfBufferBuilder<'_, '_> { } } -/// Represents a special kind of [`Map`]. Typically used to transfer data between +/// Represents a special kind of [`MapCore`]. Typically used to transfer data between /// [`Program`][crate::Program]s and userspace. #[derive(Debug)] pub struct PerfBuffer<'b> {