extern "Rust" {
fn _mmio_critical_section_acquire() -> u32;
fn _mmio_critical_section_release(state: u32);
}
pub struct IrqGuard {
state: u32,
}
impl IrqGuard {
#[inline(always)]
pub fn acquire() -> Self {
let state = unsafe { _mmio_critical_section_acquire() };
Self { state }
}
}
impl Drop for IrqGuard {
#[inline(always)]
fn drop(&mut self) {
unsafe { _mmio_critical_section_release(self.state) };
}
}
#[inline(always)]
pub fn critical_section<F, R>(f: F) -> R
where
F: FnOnce() -> R,
{
let _guard = IrqGuard::acquire();
f()
}
#[macro_export]
macro_rules! impl_critical_section {
(
acquire: $acquire:block,
release: |$state:ident| $release:block
) => {
#[no_mangle]
fn _mmio_critical_section_acquire() -> u32 {
unsafe { $acquire }
}
#[no_mangle]
fn _mmio_critical_section_release($state: u32) {
unsafe { $release }
}
};
}