k_scoped_lock.h 952 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <concepts>
  5. #include <memory>
  6. #include <type_traits>
  7. namespace Kernel {
  8. template <typename T>
  9. concept KLockable = !
  10. std::is_reference_v<T>&& requires(T& t) {
  11. { t.Lock() } -> std::same_as<void>;
  12. { t.Unlock() } -> std::same_as<void>;
  13. };
  14. template <typename T>
  15. requires KLockable<T>
  16. class KScopedLock {
  17. public:
  18. explicit KScopedLock(T* l) : m_lock(*l) {}
  19. explicit KScopedLock(T& l) : m_lock(l) {
  20. m_lock.Lock();
  21. }
  22. ~KScopedLock() {
  23. m_lock.Unlock();
  24. }
  25. KScopedLock(const KScopedLock&) = delete;
  26. KScopedLock& operator=(const KScopedLock&) = delete;
  27. KScopedLock(KScopedLock&&) = delete;
  28. KScopedLock& operator=(KScopedLock&&) = delete;
  29. private:
  30. T& m_lock;
  31. };
  32. } // namespace Kernel