lock.hpp 997 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. void lock();
  20. void unlock();
  21. lock_context_t lock_irq();
  22. void unlock_irq(lock_context_t state);
  23. };
  24. class lock_guard_irq {
  25. private:
  26. mutex& m_mtx;
  27. lock_context_t state;
  28. public:
  29. explicit inline lock_guard_irq(mutex& mtx) : m_mtx{mtx} {
  30. state = m_mtx.lock_irq();
  31. }
  32. lock_guard_irq(const lock_guard_irq&) = delete;
  33. inline ~lock_guard_irq() { m_mtx.unlock_irq(state); }
  34. };
  35. } // namespace kernel::async