k_scoped_lock.h 990 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  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 <type_traits>
  6. namespace Kernel {
  7. template <typename T>
  8. concept KLockable = !
  9. std::is_reference_v<T>&& requires(T& t) {
  10. { t.Lock() } -> std::same_as<void>;
  11. { t.Unlock() } -> std::same_as<void>;
  12. };
  13. template <typename T>
  14. requires KLockable<T>
  15. class [[nodiscard]] KScopedLock {
  16. public:
  17. explicit KScopedLock(T* l) : lock_ptr(l) {
  18. this->lock_ptr->Lock();
  19. }
  20. explicit KScopedLock(T& l) : KScopedLock(std::addressof(l)) {}
  21. ~KScopedLock() {
  22. this->lock_ptr->Unlock();
  23. }
  24. KScopedLock(const KScopedLock&) = delete;
  25. KScopedLock& operator=(const KScopedLock&) = delete;
  26. KScopedLock(KScopedLock&&) = delete;
  27. KScopedLock& operator=(KScopedLock&&) = delete;
  28. private:
  29. T* lock_ptr;
  30. };
  31. } // namespace Kernel