Lock.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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/Assertions.h>
  8. #include <AK/Types.h>
  9. #include <pthread.h>
  10. namespace Threading {
  11. class Lock {
  12. public:
  13. Lock() { }
  14. ~Lock() { }
  15. void lock();
  16. void unlock();
  17. private:
  18. pthread_mutex_t m_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
  19. };
  20. class Locker {
  21. public:
  22. ALWAYS_INLINE explicit Locker(Lock& l)
  23. : m_lock(l)
  24. {
  25. lock();
  26. }
  27. ALWAYS_INLINE ~Locker() { unlock(); }
  28. ALWAYS_INLINE void unlock() { m_lock.unlock(); }
  29. ALWAYS_INLINE void lock() { m_lock.lock(); }
  30. private:
  31. Lock& m_lock;
  32. };
  33. ALWAYS_INLINE void Lock::lock()
  34. {
  35. pthread_mutex_lock(&m_mutex);
  36. }
  37. inline void Lock::unlock()
  38. {
  39. pthread_mutex_unlock(&m_mutex);
  40. }
  41. template<typename T>
  42. class Lockable {
  43. public:
  44. Lockable() { }
  45. template<typename... Args>
  46. Lockable(Args&&... args)
  47. : m_resource(forward(args)...)
  48. {
  49. }
  50. Lockable(T&& resource)
  51. : m_resource(move(resource))
  52. {
  53. }
  54. Lock& lock() { return m_lock; }
  55. T& resource() { return m_resource; }
  56. T lock_and_copy()
  57. {
  58. Locker locker(m_lock);
  59. return m_resource;
  60. }
  61. private:
  62. T m_resource;
  63. Lock m_lock;
  64. };
  65. }