#![expect(
unsafe_code,
reason = "Using RefCell instead of UnsafeCell would be overkill",
)]
#![expect(
clippy::redundant_pub_crate,
reason = "reemphasize that these are all internals",
)]
use std::cell::UnsafeCell;
use crate::{locked_mutexes_inner::LockedMutexesInner, mutex_id::MutexID};
type Inner = LockedMutexesInner<4>;
thread_local! {
static LOCKED_MUTEXES: UnsafeCell<Inner> = UnsafeCell::default();
}
unsafe fn access_locked_mutexes<F, R>(f: F) -> R
where
F: FnOnce(&mut Inner) -> R,
{
LOCKED_MUTEXES.with(|inner| {
let locked_mutexes: *mut Inner = inner.get();
let locked_mutexes: &mut Inner = unsafe { &mut *locked_mutexes };
f(locked_mutexes)
})
}
#[must_use]
pub(crate) fn register_locked(mutex_id: MutexID) -> bool {
unsafe { access_locked_mutexes(|lm_inner| lm_inner.register_locked(mutex_id)) }
}
#[must_use]
pub(crate) fn register_unlocked(mutex_id: MutexID) -> bool {
unsafe { access_locked_mutexes(|lm_inner| lm_inner.register_unlocked(mutex_id)) }
}
#[inline]
#[must_use]
pub(crate) fn locked_by_current_thread(mutex_id: MutexID) -> bool {
unsafe { access_locked_mutexes(|lm_inner| lm_inner.locked_by_current_thread(mutex_id)) }
}