lock.hpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #pragma once
  2. #include <stdint.h>
  3. namespace kernel::async {
  4. using spinlock_t = uint32_t volatile;
  5. using preempt_count_t = size_t;
  6. void preempt_disable();
  7. void preempt_enable();
  8. preempt_count_t preempt_count();
  9. void init_spinlock(spinlock_t& lock);
  10. void spin_lock(spinlock_t& lock);
  11. void spin_unlock(spinlock_t& lock);
  12. size_t spin_lock_irqsave(spinlock_t& lock);
  13. void spin_unlock_irqrestore(spinlock_t& lock, size_t state);
  14. class mutex {
  15. private:
  16. spinlock_t m_lock;
  17. public:
  18. constexpr mutex() : m_lock {0} { }
  19. mutex(const mutex&) = delete;
  20. ~mutex();
  21. void lock();
  22. void unlock();
  23. uint32_t lock_irq();
  24. void unlock_irq(uint32_t state);
  25. };
  26. class lock_guard {
  27. private:
  28. mutex& m_mtx;
  29. public:
  30. explicit inline lock_guard(mutex& mtx)
  31. : m_mtx {mtx} { m_mtx.lock(); }
  32. lock_guard(const lock_guard&) = delete;
  33. inline ~lock_guard() { m_mtx.unlock(); }
  34. };
  35. class lock_guard_irq {
  36. private:
  37. mutex& m_mtx;
  38. uint32_t state;
  39. public:
  40. explicit inline lock_guard_irq(mutex& mtx)
  41. : m_mtx {mtx} { state = m_mtx.lock_irq(); }
  42. lock_guard_irq(const lock_guard_irq&) = delete;
  43. inline ~lock_guard_irq() { m_mtx.unlock_irq(state); }
  44. };
  45. } // namespace kernel::async