Skip to main content

steel_utils/
threading.rs

1//! Thread-count selection helpers.
2
3/// Caps an explicit positive worker count to available parallelism, or uses
4/// half the available threads with a minimum target of two.
5#[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}