use num_cpus;
#[derive(Debug, Clone, Copy)]
pub struct ConcurrencyLimits {
pub io_bound: usize,
pub cpu_bound: usize,
pub mixed: usize,
}
impl ConcurrencyLimits {
pub fn new(io_bound: usize, cpu_bound: usize, mixed: usize) -> Self {
Self {
io_bound: io_bound.max(1),
cpu_bound: cpu_bound.max(1),
mixed: mixed.max(1),
}
}
pub fn cpu_count() -> usize {
num_cpus::get()
}
}
impl Default for ConcurrencyLimits {
fn default() -> Self {
let cpus = num_cpus::get();
Self {
io_bound: cpus * 3,
cpu_bound: cpus,
mixed: cpus + (cpus / 2),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_limits() {
let limits = ConcurrencyLimits::default();
let cpus = num_cpus::get();
assert_eq!(limits.cpu_bound, cpus);
assert_eq!(limits.io_bound, cpus * 3);
assert_eq!(limits.mixed, cpus + (cpus / 2));
}
#[test]
fn test_custom_limits() {
let limits = ConcurrencyLimits::new(12, 4, 8);
assert_eq!(limits.io_bound, 12);
assert_eq!(limits.cpu_bound, 4);
assert_eq!(limits.mixed, 8);
}
#[test]
fn test_limits_minimum_one() {
let limits = ConcurrencyLimits::new(0, 0, 0);
assert_eq!(limits.io_bound, 1);
assert_eq!(limits.cpu_bound, 1);
assert_eq!(limits.mixed, 1);
}
#[test]
fn test_cpu_count() {
let count = ConcurrencyLimits::cpu_count();
assert!(count >= 1);
}
}