use std::collections::VecDeque;
use std::sync::{Arc, Mutex};
#[derive(Debug)]
pub struct BufferPool {
pool: Arc<Mutex<VecDeque<Vec<u8>>>>,
max_size: usize,
buffer_capacity: usize,
}
impl BufferPool {
pub fn new(max_size: usize, buffer_capacity: usize) -> Self {
Self {
pool: Arc::new(Mutex::new(VecDeque::with_capacity(max_size))),
max_size,
buffer_capacity,
}
}
pub fn acquire(&self) -> Vec<u8> {
let mut pool = self.pool.lock().unwrap();
pool.pop_front()
.unwrap_or_else(|| Vec::with_capacity(self.buffer_capacity))
}
pub fn release(&self, mut buffer: Vec<u8>) {
buffer.clear();
let mut pool = self.pool.lock().unwrap();
if pool.len() < self.max_size {
pool.push_back(buffer);
}
}
}
impl Default for BufferPool {
fn default() -> Self {
Self::new(16, 64 * 1024)
}
}