use std::sync::Once;
use std::sync::atomic::{AtomicUsize, Ordering};
static INIT: Once = Once::new();
static ACTIVE_WORKERS: AtomicUsize = AtomicUsize::new(0);
fn default_worker_count() -> usize {
rayon::current_num_threads().saturating_sub(2).max(1)
}
fn configured_worker_count() -> usize {
if let Ok(v) = std::env::var("EX_RENDER_WORKERS")
&& let Ok(n) = v.parse::<usize>()
&& n > 0
{
return n;
}
default_worker_count()
}
pub fn ensure_initialized() {
INIT.call_once(|| {
let workers = configured_worker_count();
let result = rayon::ThreadPoolBuilder::new()
.num_threads(workers)
.thread_name(|i| format!("ex-render-{i}"))
.build_global();
let active = if result.is_ok() {
workers
} else {
rayon::current_num_threads()
};
ACTIVE_WORKERS.store(active, Ordering::Relaxed);
});
}
#[inline]
pub fn worker_count() -> usize {
ensure_initialized();
ACTIVE_WORKERS.load(Ordering::Relaxed).max(1)
}