Skip to main content

compio_driver/buffer_pool/
fusion.rs

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