use std::cell::Cell;
use std::marker::PhantomData;
use std::sync::atomic::{AtomicBool, Ordering};
static IS_LOCKED: AtomicBool = AtomicBool::new(false);
pub struct SpiceLock {
_x: PhantomData<Cell<()>>,
}
impl SpiceLock {
pub fn try_acquire() -> Result<Self, &'static str> {
match IS_LOCKED.compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed) {
Ok(_) => Ok(Self { _x: PhantomData }),
Err(_) => Err("Cannot acquire SPICE lock: Already locked."),
}
}
}
impl Drop for SpiceLock {
fn drop(&mut self) {
IS_LOCKED.store(false, Ordering::Release);
}
}