mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-18 17:14:20 +01:00
46 lines
1.1 KiB
Rust
46 lines
1.1 KiB
Rust
use crate::io::BufferData;
|
|
use parking_lot::Mutex;
|
|
use std::pin::Pin;
|
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
|
|
|
pub struct BufferPool {
|
|
pub free_buffers: Mutex<Vec<BufferData>>,
|
|
page_size: AtomicUsize,
|
|
}
|
|
|
|
const DEFAULT_PAGE_SIZE: usize = 4096;
|
|
|
|
impl BufferPool {
|
|
pub fn new(page_size: Option<usize>) -> Self {
|
|
Self {
|
|
free_buffers: Mutex::new(Vec::new()),
|
|
page_size: AtomicUsize::new(page_size.unwrap_or(DEFAULT_PAGE_SIZE)),
|
|
}
|
|
}
|
|
|
|
pub fn set_page_size(&self, page_size: usize) {
|
|
self.page_size.store(page_size, Ordering::Relaxed);
|
|
}
|
|
|
|
pub fn get(&self) -> BufferData {
|
|
let buffer = self.free_buffers.lock().pop();
|
|
buffer.unwrap_or_else(|| Pin::new(vec![0; self.page_size.load(Ordering::Relaxed)]))
|
|
}
|
|
|
|
pub fn put(&self, buffer: BufferData) {
|
|
self.free_buffers.lock().push(buffer);
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
fn is_send_sync_static<T: Send + Sync + 'static>() {}
|
|
|
|
#[test]
|
|
fn test_send_sync() {
|
|
is_send_sync_static::<BufferPool>();
|
|
}
|
|
}
|