MutexProtected.h 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /*
  2. * Copyright (c) 2022, kleines Filmröllchen <malu.bertsch@gmail.com>.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Concepts.h>
  8. #include <AK/Noncopyable.h>
  9. #include <LibThreading/Mutex.h>
  10. namespace Threading {
  11. template<typename T>
  12. class MutexProtected {
  13. AK_MAKE_NONCOPYABLE(MutexProtected);
  14. AK_MAKE_NONMOVABLE(MutexProtected);
  15. using ProtectedType = T;
  16. public:
  17. ALWAYS_INLINE MutexProtected() = default;
  18. ALWAYS_INLINE MutexProtected(T&& value)
  19. : m_value(move(value))
  20. {
  21. }
  22. ALWAYS_INLINE explicit MutexProtected(T& value)
  23. : m_value(value)
  24. {
  25. }
  26. template<typename Callback>
  27. decltype(auto) with_locked(Callback callback)
  28. {
  29. auto lock = this->lock();
  30. // This allows users to get a copy, but if we don't allow references through &m_value, it's even more complex.
  31. return callback(m_value);
  32. }
  33. template<VoidFunction<T> Callback>
  34. void for_each_locked(Callback callback)
  35. {
  36. with_locked([&](auto& value) {
  37. for (auto& item : value)
  38. callback(item);
  39. });
  40. }
  41. private:
  42. [[nodiscard]] ALWAYS_INLINE MutexLocker lock() { return MutexLocker(m_lock); }
  43. T m_value;
  44. Mutex m_lock {};
  45. };
  46. }