dope_uring/driver/buf/
provided.rs1use 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}