ScopedCritical.h 976 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Types.h>
  8. #include <Kernel/Arch/x86/Processor.h>
  9. namespace Kernel {
  10. class ScopedCritical {
  11. AK_MAKE_NONCOPYABLE(ScopedCritical);
  12. public:
  13. ScopedCritical()
  14. {
  15. enter();
  16. }
  17. ~ScopedCritical()
  18. {
  19. if (m_valid)
  20. leave();
  21. }
  22. ScopedCritical(ScopedCritical&& from)
  23. : m_valid(exchange(from.m_valid, false))
  24. {
  25. }
  26. ScopedCritical& operator=(ScopedCritical&& from)
  27. {
  28. if (&from != this) {
  29. m_valid = exchange(from.m_valid, false);
  30. }
  31. return *this;
  32. }
  33. void leave()
  34. {
  35. VERIFY(m_valid);
  36. m_valid = false;
  37. Processor::leave_critical();
  38. }
  39. void enter()
  40. {
  41. VERIFY(!m_valid);
  42. m_valid = true;
  43. Processor::enter_critical();
  44. }
  45. private:
  46. bool m_valid { false };
  47. };
  48. }