Skip to main content

dope_core/driver/
buffers.rs

1use std::ptr::NonNull;
2
3use super::DriverContext;
4
5pub trait ProvidedBuffers {
6    fn buffer_group(&self) -> u16;
7    fn buffer_len(&self) -> usize;
8    /// # Safety
9    /// `bid` must name a live buffer uniquely owned by the caller.
10    unsafe fn release(&mut self, bid: u16);
11    /// # Safety
12    /// `bid` must name a live buffer and `len` must fit its allocation.
13    unsafe fn buffer_ptr_len(&mut self, len: u32, bid: u16) -> (NonNull<u8>, usize);
14}
15
16cfg_select! {
17    target_os = "linux" => {
18        use crate::backend::uring::provided::ring::Ring;
19
20        impl ProvidedBuffers for DriverContext<'_, '_> {
21            fn buffer_group(&self) -> u16 {
22                Ring::BGID
23            }
24
25            fn buffer_len(&self) -> usize {
26                self.backend_ref().provided.buf_len()
27            }
28
29            unsafe fn release(&mut self, bid: u16) {
30                self.backend().provided.defer(bid);
31            }
32
33            unsafe fn buffer_ptr_len(&mut self, len: u32, bid: u16) -> (NonNull<u8>, usize) {
34                let (ptr, len) = self.backend_ref().provided.ptr_len(bid, len as usize);
35                (unsafe { NonNull::new_unchecked(ptr.cast_mut()) }, len)
36            }
37        }
38    }
39    _ => {
40        use crate::backend::kqueue::driver::read::dispatch::Dispatch;
41
42        impl ProvidedBuffers for DriverContext<'_, '_> {
43            fn buffer_group(&self) -> u16 {
44                0
45            }
46
47            fn buffer_len(&self) -> usize {
48                self.backend_ref().provided.buf_len()
49            }
50
51            unsafe fn release(&mut self, bid: u16) {
52                let state = self.backend();
53                state.provided.defer(bid);
54                if !state.resume.is_empty() {
55                    state.resume_pending();
56                }
57            }
58
59            unsafe fn buffer_ptr_len(&mut self, len: u32, bid: u16) -> (NonNull<u8>, usize) {
60                unsafe { self.backend_ref().backing.ptr_len(bid, len as usize) }
61            }
62        }
63    }
64}