safa_buffer_pool/context/
mono_thread.rs1use std::{
2 cell::RefCell,
3 mem::ManuallyDrop,
4 ops::{Deref, DerefMut, Index, IndexMut},
5 rc::Rc,
6};
7
8use crate::builder::BufferPoolBuilder;
9
10use super::common::BufferPool as RawBufferPool;
11
12#[derive(Clone)]
14pub struct BufferPool {
15 inner_rc: Rc<RefCell<RawBufferPool>>,
16}
17
18impl BufferPool {
19 pub fn get(&self) -> Option<BufferGuard> {
23 let mut pool = self.inner_rc.borrow_mut();
24
25 pool.get().map(|buffer| BufferGuard{
26 pool: self.clone(),
27 buffer
28 })
29 }
30
31 pub fn clean_excess_buffer(&mut self) {
33 let mut pool = self.inner_rc.borrow_mut();
34
35 pool.clean_excess_buffer();
36 }
37
38 pub fn from_builder(builder: &BufferPoolBuilder) -> Self {
40 Self {
41 inner_rc: Rc::new(RefCell::new(RawBufferPool::from_builder(builder))),
42 }
43 }
44}
45
46pub struct BufferGuard {
48 pool: BufferPool,
49 buffer: ManuallyDrop<Box<[u8]>>,
50}
51
52impl Drop for BufferGuard {
53 fn drop(&mut self) {
54 let mut pool = self.pool.inner_rc.borrow_mut();
55 let buffer = unsafe{ManuallyDrop::take(&mut self.buffer)};
56
57 pool.free(buffer);
58 }
59}
60
61impl Deref for BufferGuard {
62 type Target = [u8];
63 fn deref(&self) -> &Self::Target {
64 &self.buffer
65 }
66}
67
68impl DerefMut for BufferGuard {
69 fn deref_mut(&mut self) -> &mut Self::Target {
70 &mut self.buffer
71 }
72}
73
74impl Index<usize> for BufferGuard {
75 type Output = u8;
76 fn index(&self, idx: usize) -> &Self::Output {
77 &self.buffer[idx]
78 }
79}
80impl IndexMut<usize> for BufferGuard {
81 fn index_mut(&mut self, idx: usize) -> &mut Self::Output {
82 &mut self.buffer[idx]
83 }
84}