use super::ScanError;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct ScanOptions {
pub thread_budget: usize,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ScanStats {
pub dims_touched: u64,
pub bytes_read: u64,
pub threads_used: usize,
pub worker_thread_ids: Vec<std::thread::ThreadId>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct ScanOutcome {
pub candidates: Vec<super::ScanCandidate>,
pub stats: ScanStats,
pub worst_score: Option<f32>,
}
pub fn physical_thread_capacity() -> Result<usize, ScanError> {
static CAPACITY: std::sync::OnceLock<Result<usize, String>> = std::sync::OnceLock::new();
match CAPACITY.get_or_init(detect_physical_thread_capacity) {
Ok(capacity) => Ok(*capacity),
Err(error) => Err(ScanError::CpuCount(error.clone())),
}
}
fn detect_physical_thread_capacity() -> Result<usize, String> {
#[cfg(any(target_os = "macos", target_os = "ios"))]
{
crate::sys::darwin::physical_performance_core_count().map_err(|error| error.to_string())
}
#[cfg(not(any(target_os = "macos", target_os = "ios")))]
{
std::thread::available_parallelism()
.map(std::num::NonZeroUsize::get)
.map_err(|error| error.to_string())
}
}