k_scoped_lock.h 1008 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 [[nodiscard]] KScopedLock {
  17. public:
  18. explicit KScopedLock(T* l) : lock_ptr(l) {
  19. this->lock_ptr->Lock();
  20. }
  21. explicit KScopedLock(T& l) : KScopedLock(std::addressof(l)) {}
  22. ~KScopedLock() {
  23. this->lock_ptr->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* lock_ptr;
  31. };
  32. } // namespace Kernel