@@ -9,15 +9,13 @@ use std::ptr::NonNull;
9
9
use std:: slice;
10
10
use std:: time:: Duration ;
11
11
12
- use crate :: util;
13
12
use crate :: util:: validate_bpf_ret;
14
13
use crate :: AsRawLibbpf ;
15
14
use crate :: Error ;
16
15
use crate :: ErrorExt as _;
17
- use crate :: Map ;
18
- use crate :: MapCore as _;
19
16
use crate :: MapType ;
20
17
use crate :: Result ;
18
+ use crate :: { util, MapCore } ;
21
19
22
20
// Workaround for `trait_alias`
23
21
// (https://doc.rust-lang.org/unstable-book/language-features/trait-alias.html)
@@ -44,16 +42,22 @@ impl Debug for CbStruct<'_> {
44
42
}
45
43
46
44
/// 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 ,
49
50
pages : usize ,
50
51
sample_cb : Option < Box < dyn SampleCb + ' b > > ,
51
52
lost_cb : Option < Box < dyn LostCb + ' b > > ,
52
53
}
53
54
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 {
57
61
Self {
58
62
map,
59
63
pages : 64 ,
@@ -63,14 +67,17 @@ impl<'a> PerfBufferBuilder<'a, '_> {
63
67
}
64
68
}
65
69
66
- impl < ' a , ' b > PerfBufferBuilder < ' a , ' b > {
70
+ impl < ' a , ' b , M > PerfBufferBuilder < ' a , ' b , M >
71
+ where
72
+ M : MapCore + AsFd ,
73
+ {
67
74
/// Callback to run when a sample is received.
68
75
///
69
76
/// This callback provides a raw byte slice. You may find libraries such as
70
77
/// [`plain`](https://crates.io/crates/plain) helpful.
71
78
///
72
79
/// 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 > {
74
81
PerfBufferBuilder {
75
82
map : self . map ,
76
83
pages : self . pages ,
@@ -82,7 +89,7 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
82
89
/// Callback to run when a sample is received.
83
90
///
84
91
/// 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 > {
86
93
PerfBufferBuilder {
87
94
map : self . map ,
88
95
pages : self . pages ,
@@ -92,7 +99,7 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
92
99
}
93
100
94
101
/// 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 > {
96
103
PerfBufferBuilder {
97
104
map : self . map ,
98
105
pages,
@@ -164,7 +171,10 @@ impl<'a, 'b> PerfBufferBuilder<'a, 'b> {
164
171
}
165
172
}
166
173
167
- impl Debug for PerfBufferBuilder < ' _ , ' _ > {
174
+ impl < M > Debug for PerfBufferBuilder < ' _ , ' _ , M >
175
+ where
176
+ M : MapCore + AsFd ,
177
+ {
168
178
fn fmt ( & self , f : & mut Formatter < ' _ > ) -> FmtResult {
169
179
let Self {
170
180
map,
@@ -181,7 +191,7 @@ impl Debug for PerfBufferBuilder<'_, '_> {
181
191
}
182
192
}
183
193
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
185
195
/// [`Program`][crate::Program]s and userspace.
186
196
#[ derive( Debug ) ]
187
197
pub struct PerfBuffer < ' b > {
0 commit comments