1#[must_use]
6pub fn worker_threads_for_available(
7 configured_threads: Option<usize>,
8 available_threads: usize,
9) -> usize {
10 let available_threads = available_threads.max(1);
11 if let Some(configured_threads) = configured_threads.filter(|&threads| threads > 0) {
12 return configured_threads.min(available_threads);
13 }
14
15 ((available_threads / 2).max(2)).min(available_threads)
16}
17
18#[cfg(test)]
19mod tests {
20 use super::worker_threads_for_available;
21
22 #[test]
23 fn explicit_worker_count_is_capped_to_available_threads() {
24 assert_eq!(worker_threads_for_available(Some(16), 8), 8);
25 assert_eq!(worker_threads_for_available(Some(4), 8), 4);
26 }
27
28 #[test]
29 fn zero_or_missing_worker_count_uses_auto_default() {
30 assert_eq!(worker_threads_for_available(Some(0), 8), 4);
31 assert_eq!(worker_threads_for_available(None, 8), 4);
32 assert_eq!(worker_threads_for_available(None, 1), 1);
33 }
34}