use bytes::BytesMut;
use std::collections::VecDeque;
pub const BUFFER_STANDARD_SIZE: usize = 4096; const BUFFER_DANGER_SIZE: usize = 65536;
pub struct BufferPool {
pool: VecDeque<BytesMut>,
buffer_size: usize,
}
impl BufferPool {
pub fn new(initial_capacitiy: usize, buffer_size: usize) -> Self {
let mut pool = VecDeque::with_capacity(initial_capacitiy);
for _ in 0..initial_capacitiy {
pool.push_back(BytesMut::with_capacity(buffer_size));
}
BufferPool { pool, buffer_size }
}
pub fn checkout(&mut self) -> BytesMut {
self.pool.pop_front().unwrap_or_else(|| {
BytesMut::with_capacity(self.buffer_size)
})
}
pub fn return_buffer(&mut self, mut buf: BytesMut) {
buf.clear();
if buf.capacity() < BUFFER_DANGER_SIZE {
self.pool.push_back(buf);
} else {
self.pool.push_back(BytesMut::with_capacity(self.buffer_size));
}
}
}