irq-framework 0.1.0

A no_std dynamic IRQ registration and dispatch framework
Documentation
use core::sync::atomic::{AtomicBool, Ordering};

use crate::IrqOps;

pub(crate) struct MetadataLock {
    locked: AtomicBool,
}

impl MetadataLock {
    pub(crate) const fn new() -> Self {
        Self {
            locked: AtomicBool::new(false),
        }
    }

    pub(crate) fn lock<O: IrqOps>(&self, ops: &O) -> O::LocalIrqState {
        let state = ops.local_irq_save();
        while self
            .locked
            .compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
            .is_err()
        {
            ops.relax();
        }
        state
    }

    pub(crate) fn unlock<O: IrqOps>(&self, ops: &O, state: O::LocalIrqState) {
        self.locked.store(false, Ordering::Release);
        ops.local_irq_restore(state);
    }
}