Skip to main content

dope_uring/driver/buf/
provided.rs

1use crate::driver::current_driver_mut;
2
3pub struct ProvidedBuf {
4    bid: u16,
5    ptr: *mut u8,
6    start: usize,
7    len: usize,
8    released: bool,
9}
10
11impl ProvidedBuf {
12    pub(crate) fn new(bid: u16, ptr: *mut u8, cap: usize, len: usize) -> Self {
13        assert!(
14            len <= cap,
15            "provided buffer length must not exceed guard capacity"
16        );
17        Self {
18            bid,
19            ptr,
20            start: 0,
21            len,
22            released: false,
23        }
24    }
25
26    pub fn len(&self) -> usize {
27        self.len
28    }
29
30    pub fn as_slice(&self) -> &[u8] {
31        let start_ptr = unsafe { self.ptr.add(self.start) };
32        unsafe { std::slice::from_raw_parts(start_ptr as *const u8, self.len) }
33    }
34
35    #[allow(clippy::should_implement_trait)]
36    pub fn as_mut(&mut self) -> &mut [u8] {
37        let start_ptr = unsafe { self.ptr.add(self.start) };
38        unsafe { std::slice::from_raw_parts_mut(start_ptr, self.len) }
39    }
40}
41
42impl Drop for ProvidedBuf {
43    fn drop(&mut self) {
44        if self.released {
45            return;
46        }
47        current_driver_mut().provided.release(self.bid);
48    }
49}
50
51impl AsRef<[u8]> for ProvidedBuf {
52    fn as_ref(&self) -> &[u8] {
53        self.as_slice()
54    }
55}