use crate::inner::Inner;
use crate::tx::Transaction;
use crate::TransactionInner;
use crossbeam_queue::ArrayQueue;
use std::sync::Arc;
pub(crate) const DEFAULT_POOL_SIZE: usize = 512;
pub(crate) struct Pool {
inner: Arc<Inner>,
pool: ArrayQueue<TransactionInner>,
}
impl Pool {
pub(crate) fn new(inner: Arc<Inner>, size: usize) -> Arc<Self> {
Arc::new(Self {
inner,
pool: ArrayQueue::new(size),
})
}
pub(crate) fn put(self: &Arc<Self>, inner: TransactionInner) {
let _ = self.pool.push(inner);
}
pub(crate) fn get(self: &Arc<Self>, write: bool) -> Transaction {
let inner = if let Some(mut tx) = self.pool.pop() {
tx.reset(write);
tx
} else {
TransactionInner::new(self.inner.clone(), write)
};
Transaction {
inner: Some(inner),
pool: Arc::clone(self),
}
}
}