use std::sync::{Arc, atomic::AtomicBool};
use brk_rpc::Client;
use parking_lot::{RwLock, RwLockReadGuard};
mod api;
mod cycle;
mod diagnostics;
mod driver;
mod snapshot;
mod state;
mod steps;
mod stores;
#[cfg(test)]
mod test_support;
pub use api::{RbfForTx, RbfNode};
pub use cycle::{AddedKind, Cycle, TxAdded, TxRemoved};
pub use diagnostics::MempoolStats;
pub use snapshot::Snapshot;
pub use steps::TxRemoval;
use snapshot::Rebuilder;
use state::State;
#[derive(Clone)]
pub struct Mempool(Arc<Inner>);
struct Inner {
client: Client,
state: RwLock<State>,
rebuilder: Rebuilder,
started: AtomicBool,
}
impl Mempool {
pub fn new(client: &Client) -> Self {
Self(Arc::new(Inner {
client: client.clone(),
state: RwLock::new(State::default()),
rebuilder: Rebuilder::default(),
started: AtomicBool::new(false),
}))
}
pub fn snapshot(&self) -> Arc<Snapshot> {
self.0.rebuilder.snapshot()
}
pub fn stats(&self) -> MempoolStats {
MempoolStats::from(self)
}
fn rebuilder(&self) -> &Rebuilder {
&self.0.rebuilder
}
fn read(&self) -> RwLockReadGuard<'_, State> {
self.0.state.read()
}
}
#[cfg(test)]
mod test_helpers {
use brk_rpc::Auth;
use brk_types::{FeeRate, Txid};
use super::*;
impl Mempool {
pub(crate) fn for_test() -> Self {
let client = Client::new(Client::default_url(), Auth::None).unwrap();
Self(Arc::new(Inner {
client,
state: RwLock::new(State::default()),
rebuilder: Rebuilder::default(),
started: AtomicBool::new(false),
}))
}
pub(crate) fn test_state_lock(&self) -> &RwLock<State> {
&self.0.state
}
pub(crate) fn test_tick(&self, gbt_txids: &[Txid], min_fee: FeeRate) {
self.0.rebuilder.tick(&self.0.state, gbt_txids, min_fee);
}
}
}