Skip to content

Commit 450a5db

Browse files
d-e-s-oinsearchoflosttime
authored andcommitted
libbpf-rs: Implement Send for PerfBuffer and RingBuffer
As per #224 (comment) ring buffers and perf buffers can be polled from any thread. Hence, it is safe for us to implement `Send` for the corresponding Rust types, `RingBuffer` and `PerfBuffer`. Closes: #224 Signed-off-by: Daniel Müller <deso@posteo.net>
1 parent 4c7034e commit 450a5db

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

libbpf-rs/src/perf_buffer.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,30 @@ impl<'b> PerfBuffer<'b> {
220220
}
221221
}
222222

223-
impl<'b> Drop for PerfBuffer<'b> {
223+
// SAFETY: `perf_buffer` objects can safely be polled from any thread.
224+
unsafe impl Send for PerfBuffer<'_> {}
225+
226+
impl Drop for PerfBuffer<'_> {
224227
fn drop(&mut self) {
225228
unsafe {
226229
libbpf_sys::perf_buffer__free(self.ptr);
227230
}
228231
}
229232
}
233+
234+
#[cfg(test)]
235+
mod test {
236+
use super::*;
237+
238+
/// Check that `PerfBuffer` is `Send`.
239+
#[test]
240+
fn perfbuffer_is_send() {
241+
fn test<T>()
242+
where
243+
T: Send,
244+
{
245+
}
246+
247+
test::<PerfBuffer>();
248+
}
249+
}

libbpf-rs/src/ringbuf.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,10 @@ impl<'a> RingBuffer<'a> {
178178
}
179179
}
180180

181-
impl<'a> Drop for RingBuffer<'a> {
181+
// SAFETY: `ring_buffer` objects can safely be polled from any thread.
182+
unsafe impl Send for RingBuffer<'_> {}
183+
184+
impl Drop for RingBuffer<'_> {
182185
fn drop(&mut self) {
183186
unsafe {
184187
if !self.ptr.is_null() {
@@ -187,3 +190,20 @@ impl<'a> Drop for RingBuffer<'a> {
187190
}
188191
}
189192
}
193+
194+
#[cfg(test)]
195+
mod test {
196+
use super::*;
197+
198+
/// Check that `RingBuffer` is `Send`.
199+
#[test]
200+
fn perfbuffer_is_send() {
201+
fn test<T>()
202+
where
203+
T: Send,
204+
{
205+
}
206+
207+
test::<RingBuffer>();
208+
}
209+
}

0 commit comments

Comments
 (0)