Skip to main content

limbo_core/storage/
buffer_pool.rs

1use crate::io::BufferData;
2use std::cell::RefCell;
3use std::pin::Pin;
4
5pub struct BufferPool {
6    pub free_buffers: RefCell<Vec<BufferData>>,
7    page_size: usize,
8}
9
10impl BufferPool {
11    pub fn new(page_size: usize) -> Self {
12        Self {
13            free_buffers: RefCell::new(Vec::new()),
14            page_size,
15        }
16    }
17
18    pub fn get(&self) -> BufferData {
19        let mut free_buffers = self.free_buffers.borrow_mut();
20        if let Some(buffer) = free_buffers.pop() {
21            buffer
22        } else {
23            Pin::new(vec![0; self.page_size])
24        }
25    }
26
27    pub fn put(&self, buffer: BufferData) {
28        let mut free_buffers = self.free_buffers.borrow_mut();
29        free_buffers.push(buffer);
30    }
31}