use core::{
hint,
sync::atomic::{AtomicBool, Ordering},
};
pub(super) struct Lock {
locked: AtomicBool,
}
impl Lock {
pub const fn new() -> Self {
Self {
locked: AtomicBool::new(false),
}
}
pub fn lock(&self) {
while !self.try_lock() {
while self.locked.load(Ordering::Relaxed) {
hint::spin_loop();
}
}
}
#[must_use]
#[inline(always)]
pub fn try_lock(&self) -> bool {
self.locked
.compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
.is_ok()
}
pub unsafe fn unlock(&self) {
self.locked.store(false, Ordering::Release);
}
}