cm_thread.hxx 866 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #ifndef CM_THREAD_HXX
  4. #define CM_THREAD_HXX
  5. #include "cmConfigure.h" // IWYU pragma: keep
  6. #include "cm_uv.h"
  7. namespace cm {
  8. class shared_mutex
  9. {
  10. uv_rwlock_t _M_;
  11. CM_DISABLE_COPY(shared_mutex)
  12. public:
  13. shared_mutex() { uv_rwlock_init(&_M_); }
  14. ~shared_mutex() { uv_rwlock_destroy(&_M_); }
  15. void lock() { uv_rwlock_wrlock(&_M_); }
  16. void unlock() { uv_rwlock_wrunlock(&_M_); }
  17. void lock_shared() { uv_rwlock_rdlock(&_M_); }
  18. void unlock_shared() { uv_rwlock_rdunlock(&_M_); }
  19. };
  20. template <typename T>
  21. class shared_lock
  22. {
  23. T& _mutex;
  24. CM_DISABLE_COPY(shared_lock)
  25. public:
  26. shared_lock(T& m)
  27. : _mutex(m)
  28. {
  29. _mutex.lock_shared();
  30. }
  31. ~shared_lock() { _mutex.unlock_shared(); }
  32. };
  33. }
  34. #endif