dope_core/driver/
buffers.rs1use std::ptr::NonNull;
2
3use super::DriverContext;
4
5pub trait ProvidedBuffers {
6 fn buffer_group(&self) -> u16;
7 fn buffer_len(&self) -> usize;
8 unsafe fn release(&mut self, bid: u16);
11 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}