use std::num::NonZeroUsize;
pub(crate) fn default_threads() -> usize {
let available = std::thread::available_parallelism()
.map(NonZeroUsize::get)
.unwrap_or(1);
available
.min(metadata_concurrency_ceiling())
.min(crate::MAX_WORKERS)
}
#[cfg(not(all(target_os = "macos", target_arch = "aarch64")))]
const fn metadata_concurrency_ceiling() -> usize {
usize::MAX
}
#[cfg(all(target_os = "macos", target_arch = "aarch64"))]
fn metadata_concurrency_ceiling() -> usize {
use std::sync::OnceLock;
static CEILING: OnceLock<usize> = OnceLock::new();
*CEILING.get_or_init(|| {
performance_cluster_width()
.filter(|width| *width >= 2)
.unwrap_or(usize::MAX)
})
}
#[cfg(all(target_os = "macos", target_arch = "aarch64"))]
fn performance_cluster_width() -> Option<usize> {
let mut width: u32 = 0;
let mut size = std::mem::size_of::<u32>();
let status = unsafe {
libc::sysctlbyname(
c"hw.perflevel0.cpusperl2".as_ptr(),
(&raw mut width).cast(),
&raw mut size,
std::ptr::null_mut(),
0,
)
};
if status != 0 || size != std::mem::size_of::<u32>() {
return None;
}
Some(width as usize)
}
#[cfg(test)]
mod tests {
use super::{default_threads, metadata_concurrency_ceiling};
#[test]
fn default_is_a_usable_worker_count() {
let threads = default_threads();
assert!(threads >= 1, "the default must start at least one worker");
assert!(
threads <= crate::MAX_WORKERS,
"the default must respect the eager worker ceiling"
);
assert!(
threads
<= std::thread::available_parallelism()
.map(std::num::NonZeroUsize::get)
.unwrap_or(1),
"the default must not exceed what the host reports"
);
}
#[test]
fn the_ceiling_never_starves_a_walk() {
assert!(
metadata_concurrency_ceiling() >= 2,
"a ceiling below two would make the default serial on every host"
);
}
#[test]
fn an_explicit_budget_is_not_capped_by_the_ceiling() {
let asked = metadata_concurrency_ceiling().saturating_add(1).min(64);
let walker = crate::Walker::new(".").threads(asked);
assert_eq!(walker.threads, asked);
}
}