lock.hpp 960 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #pragma once
  2. #include <cstddef>
  3. #include <stdint.h>
  4. namespace kernel::async {
  5. using spinlock_t = unsigned long volatile;
  6. using lock_context_t = unsigned long;
  7. void init_spinlock(spinlock_t& lock);
  8. void spin_lock(spinlock_t& lock);
  9. void spin_unlock(spinlock_t& lock);
  10. lock_context_t spin_lock_irqsave(spinlock_t& lock);
  11. void spin_unlock_irqrestore(spinlock_t& lock, lock_context_t context);
  12. class mutex {
  13. private:
  14. spinlock_t m_lock;
  15. public:
  16. constexpr mutex() : m_lock{0} {}
  17. mutex(const mutex&) = delete;
  18. ~mutex();
  19. lock_context_t lock_irq();
  20. void unlock_irq(lock_context_t state);
  21. };
  22. class lock_guard_irq {
  23. private:
  24. mutex& m_mtx;
  25. lock_context_t state;
  26. public:
  27. explicit inline lock_guard_irq(mutex& mtx) : m_mtx{mtx} {
  28. state = m_mtx.lock_irq();
  29. }
  30. lock_guard_irq(const lock_guard_irq&) = delete;
  31. inline ~lock_guard_irq() { m_mtx.unlock_irq(state); }
  32. };
  33. } // namespace kernel::async