use std::time::Duration;
use crate::dispatch::DispatchStrategy;
#[derive(Debug, Clone)]
pub struct PoolStats {
pub name: String,
pub running: usize,
pub capacity: usize,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
#[non_exhaustive]
pub enum OverflowPolicy {
#[default]
Block,
Reject,
DropOldest,
}
pub struct PoolConfig {
pub name: String,
pub size: usize,
pub queue_size: usize,
pub event_buffer: usize,
pub grace_period: Duration,
pub dispatch: DispatchStrategy,
pub overflow_policy: OverflowPolicy,
}
impl Default for PoolConfig {
fn default() -> Self {
Self {
name: "pool".into(),
size: available_parallelism(),
queue_size: 256,
event_buffer: 64,
grace_period: Duration::from_secs(30),
dispatch: DispatchStrategy::RoundRobin,
overflow_policy: OverflowPolicy::Block,
}
}
}
impl PoolConfig {
#[must_use]
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
..Default::default()
}
}
#[must_use]
pub fn with_size(mut self, size: usize) -> Self {
self.size = size;
self
}
#[must_use]
pub fn with_queue_size(mut self, queue_size: usize) -> Self {
self.queue_size = queue_size;
self
}
#[must_use]
pub fn with_grace_period(mut self, d: Duration) -> Self {
self.grace_period = d;
self
}
#[must_use]
pub fn with_overflow_policy(mut self, overflow_policy: OverflowPolicy) -> Self {
self.overflow_policy = overflow_policy;
self
}
}
fn available_parallelism() -> usize {
std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(4)
}