compio_driver/buffer_pool/
fusion.rs

1use std::{
2    borrow::{Borrow, BorrowMut},
3    fmt::{Debug, Formatter},
4    ops::{Deref, DerefMut},
5};
6
7#[path = "fallback.rs"]
8mod fallback;
9
10#[path = "iour.rs"]
11mod iour;
12
13pub use fallback::BufferPool as FallbackBufferPool;
14pub(crate) use fallback::OwnedBuffer;
15pub use iour::BufferPool as IoUringBufferPool;
16
17/// Buffer pool
18///
19/// A buffer pool to allow user no need to specify a specific buffer to do the
20/// IO operation
21pub struct BufferPool {
22    inner: BufferPollInner,
23}
24
25impl Debug for BufferPool {
26    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
27        f.debug_struct("BufferPool").finish_non_exhaustive()
28    }
29}
30
31impl BufferPool {
32    pub(crate) fn is_io_uring(&self) -> bool {
33        matches!(&self.inner, BufferPollInner::IoUring(_))
34    }
35
36    pub(crate) fn new_io_uring(buffer_pool: iour::BufferPool) -> Self {
37        Self {
38            inner: BufferPollInner::IoUring(buffer_pool),
39        }
40    }
41
42    pub(crate) fn as_io_uring(&self) -> &iour::BufferPool {
43        match &self.inner {
44            BufferPollInner::IoUring(inner) => inner,
45            BufferPollInner::Poll(_) => panic!("BufferPool type is not poll type"),
46        }
47    }
48
49    pub(crate) fn as_poll(&self) -> &fallback::BufferPool {
50        match &self.inner {
51            BufferPollInner::Poll(inner) => inner,
52            BufferPollInner::IoUring(_) => panic!("BufferPool type is not io-uring type"),
53        }
54    }
55
56    pub(crate) fn new_poll(buffer_pool: fallback::BufferPool) -> Self {
57        Self {
58            inner: BufferPollInner::Poll(buffer_pool),
59        }
60    }
61
62    pub(crate) fn into_io_uring(self) -> iour::BufferPool {
63        match self.inner {
64            BufferPollInner::IoUring(inner) => inner,
65            BufferPollInner::Poll(_) => panic!("BufferPool type is not poll type"),
66        }
67    }
68}
69
70enum BufferPollInner {
71    IoUring(iour::BufferPool),
72    Poll(fallback::BufferPool),
73}
74
75/// Buffer borrowed from buffer pool
76///
77/// When IO operation finish, user will obtain a `BorrowedBuffer` to access the
78/// filled data
79pub struct BorrowedBuffer<'a> {
80    inner: BorrowedBufferInner<'a>,
81}
82
83impl<'a> BorrowedBuffer<'a> {
84    pub(crate) fn new_io_uring(buffer: iour::BorrowedBuffer<'a>) -> Self {
85        Self {
86            inner: BorrowedBufferInner::IoUring(buffer),
87        }
88    }
89
90    pub(crate) fn new_poll(buffer: fallback::BorrowedBuffer<'a>) -> Self {
91        Self {
92            inner: BorrowedBufferInner::Poll(buffer),
93        }
94    }
95}
96
97enum BorrowedBufferInner<'a> {
98    IoUring(iour::BorrowedBuffer<'a>),
99    Poll(fallback::BorrowedBuffer<'a>),
100}
101
102impl Debug for BorrowedBuffer<'_> {
103    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
104        f.debug_struct("BorrowedBuffer").finish_non_exhaustive()
105    }
106}
107
108impl Deref for BorrowedBuffer<'_> {
109    type Target = [u8];
110
111    fn deref(&self) -> &Self::Target {
112        match &self.inner {
113            BorrowedBufferInner::IoUring(inner) => inner.deref(),
114            BorrowedBufferInner::Poll(inner) => inner.deref(),
115        }
116    }
117}
118
119impl DerefMut for BorrowedBuffer<'_> {
120    fn deref_mut(&mut self) -> &mut Self::Target {
121        match &mut self.inner {
122            BorrowedBufferInner::IoUring(inner) => inner.deref_mut(),
123            BorrowedBufferInner::Poll(inner) => inner.deref_mut(),
124        }
125    }
126}
127
128impl AsRef<[u8]> for BorrowedBuffer<'_> {
129    fn as_ref(&self) -> &[u8] {
130        self.deref()
131    }
132}
133
134impl AsMut<[u8]> for BorrowedBuffer<'_> {
135    fn as_mut(&mut self) -> &mut [u8] {
136        self.deref_mut()
137    }
138}
139
140impl Borrow<[u8]> for BorrowedBuffer<'_> {
141    fn borrow(&self) -> &[u8] {
142        self.deref()
143    }
144}
145
146impl BorrowMut<[u8]> for BorrowedBuffer<'_> {
147    fn borrow_mut(&mut self) -> &mut [u8] {
148        self.deref_mut()
149    }
150}