use std::num::NonZeroUsize;
use crate::runtime::blocking_worker::BlockingPool;
#[derive(Debug, Clone)]
pub(crate) enum BlockingPools {
Shared(BlockingPool),
PerWorker(Option<NonZeroUsize>),
}
impl BlockingPools {
pub(crate) const fn per_worker(max_workers: Option<NonZeroUsize>) -> Self {
Self::PerWorker(max_workers)
}
pub(crate) fn shared(max_workers: Option<NonZeroUsize>) -> Self {
Self::Shared(BlockingPool::new_with_mode(max_workers, "shared"))
}
pub(super) fn build_worker(&self) -> BlockingPool {
match self {
Self::Shared(pool) => pool.clone(),
Self::PerWorker(max_workers) => BlockingPool::new_with_mode(*max_workers, "per_worker"),
}
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))] mod tests {
use super::*;
#[test]
fn shared_policy_reuses_the_same_blocking_pool() {
let pools = BlockingPools::shared(NonZeroUsize::new(1));
assert!(pools.build_worker().shares_pool_with(&pools.build_worker()));
}
#[test]
fn per_worker_policy_creates_independent_blocking_pools() {
let pools = BlockingPools::per_worker(NonZeroUsize::new(1));
assert!(!pools.build_worker().shares_pool_with(&pools.build_worker()));
}
}