pub const NORMALIZED_FAIR_SLICE_NS: u64 = 700_000;
pub const DEFAULT_TIMING_GRANULARITY_NS: u64 = 1_000_000;
pub const DEFAULT_BALANCE_INTERVAL_NS: u64 = 10_000_000;
pub const DEFAULT_RR_QUANTUM_NS: u64 = 100_000_000;
pub const DEFAULT_RT_PERIOD_NS: u64 = 1_000_000_000;
pub const DEFAULT_RT_RUNTIME_NS: u64 = DEFAULT_RT_PERIOD_NS;
pub const DEFAULT_DEADLINE_CAP_PERCENT: u8 = 95;
pub const DEFAULT_THREAD_CAPACITY: usize = 4096;
pub const DEFAULT_BATCH_LIMIT: usize = 64;
pub const DEFAULT_PI_CHAIN_LIMIT: usize = 64;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct TaskSystemConfig {
cpu_count: usize,
fair_slice_ns: u64,
timing_granularity_ns: u64,
balance_interval_ns: u64,
rr_quantum_ns: u64,
rt_period_ns: u64,
rt_runtime_ns: u64,
deadline_cap_percent: u8,
thread_capacity: usize,
batch_limit: usize,
pi_chain_limit: usize,
}
impl TaskSystemConfig {
pub const fn new(cpu_count: usize) -> Self {
Self {
cpu_count,
fair_slice_ns: NORMALIZED_FAIR_SLICE_NS * linux_logarithmic_cpu_factor(cpu_count),
timing_granularity_ns: DEFAULT_TIMING_GRANULARITY_NS,
balance_interval_ns: DEFAULT_BALANCE_INTERVAL_NS,
rr_quantum_ns: DEFAULT_RR_QUANTUM_NS,
rt_period_ns: DEFAULT_RT_PERIOD_NS,
rt_runtime_ns: DEFAULT_RT_RUNTIME_NS,
deadline_cap_percent: DEFAULT_DEADLINE_CAP_PERCENT,
thread_capacity: DEFAULT_THREAD_CAPACITY,
batch_limit: DEFAULT_BATCH_LIMIT,
pi_chain_limit: DEFAULT_PI_CHAIN_LIMIT,
}
}
pub const fn cpu_count(self) -> usize {
self.cpu_count
}
pub const fn fair_slice_ns(self) -> u64 {
self.fair_slice_ns
}
pub const fn timing_granularity_ns(self) -> u64 {
self.timing_granularity_ns
}
pub const fn balance_interval_ns(self) -> u64 {
self.balance_interval_ns
}
pub const fn rr_quantum_ns(self) -> u64 {
self.rr_quantum_ns
}
pub const fn rt_period_ns(self) -> u64 {
self.rt_period_ns
}
pub const fn rt_runtime_ns(self) -> u64 {
self.rt_runtime_ns
}
pub const fn deadline_cap_percent(self) -> u8 {
self.deadline_cap_percent
}
pub const fn thread_capacity(self) -> usize {
self.thread_capacity
}
pub const fn batch_limit(self) -> usize {
self.batch_limit
}
pub const fn pi_chain_limit(self) -> usize {
self.pi_chain_limit
}
pub const fn with_deadline_cap_percent(mut self, percent: u8) -> Self {
self.deadline_cap_percent = percent;
self
}
pub const fn with_balance_interval_ns(mut self, interval_ns: u64) -> Self {
self.balance_interval_ns = interval_ns;
self
}
pub const fn with_rt_bandwidth(mut self, period_ns: u64, runtime_ns: u64) -> Self {
self.rt_period_ns = period_ns;
self.rt_runtime_ns = runtime_ns;
self
}
pub const fn with_thread_capacity(mut self, capacity: usize) -> Self {
self.thread_capacity = capacity;
self
}
pub const fn with_batch_limit(mut self, limit: usize) -> Self {
self.batch_limit = limit;
self
}
pub const fn with_pi_chain_limit(mut self, limit: usize) -> Self {
self.pi_chain_limit = limit;
self
}
}
const fn linux_logarithmic_cpu_factor(cpu_count: usize) -> u64 {
let capped = if cpu_count == 0 {
1
} else if cpu_count > 8 {
8
} else {
cpu_count
};
1 + capped.ilog2() as u64
}