use std::{
hash::{DefaultHasher, Hash, Hasher},
sync::atomic::{AtomicUsize, Ordering},
};
pub(crate) static ACTIVE_NAMED_THREADS: AtomicUsize = AtomicUsize::new(0);
#[must_use]
pub fn active_named_thread_count() -> usize {
ACTIVE_NAMED_THREADS.load(Ordering::Acquire)
}
pub(crate) fn counted<F, T>(f: F) -> impl FnOnce() -> T + Send + 'static
where
F: FnOnce() -> T + Send + 'static,
T: Send + 'static,
{
ACTIVE_NAMED_THREADS.fetch_add(1, Ordering::Release);
move || {
let result = f();
ACTIVE_NAMED_THREADS.fetch_sub(1, Ordering::Release);
result
}
}
#[inline]
#[must_use]
pub(crate) fn thread_id_hash<I: Hash>(id: I) -> u64 {
let mut hasher = DefaultHasher::new();
id.hash(&mut hasher);
hasher.finish()
}