safa_buffer_pool/context/
mono_thread.rs

1use 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///BufferPool for Mono-thread context
13#[derive(Clone)]
14pub struct BufferPool {
15    inner_rc: Rc<RefCell<RawBufferPool>>,
16}
17
18impl BufferPool {
19    ///Get a new buffer from the pool
20    /// 
21    ///Return None if none buffer available
22    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    ///Optimize the number of buffer by deleted excess buffer of the pool
32    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    ///Like BufferPoolBuilder.build_mono_thread()
39    pub fn from_builder(builder: &BufferPoolBuilder) -> Self {
40        Self {
41            inner_rc: Rc::new(RefCell::new(RawBufferPool::from_builder(builder))),
42        }
43    }
44}
45
46///A buffer guard for auto-drop of buffer, useable like a buffer
47pub 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}