lockhelper.hpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #ifndef KC_LOCKHELPER_HPP
  2. #define KC_LOCKHELPER_HPP 1
  3. #include <kopano/zcdefs.h>
  4. #include <mutex>
  5. #include <new>
  6. #include <cassert>
  7. #include <pthread.h>
  8. namespace KC {
  9. /* std::shared_mutex only available from C++17 onwards */
  10. class shared_mutex {
  11. public:
  12. ~shared_mutex(void) { pthread_rwlock_destroy(&mtx); }
  13. void lock(void) { pthread_rwlock_wrlock(&mtx); }
  14. void unlock(void) { pthread_rwlock_unlock(&mtx); }
  15. void lock_shared(void) { pthread_rwlock_rdlock(&mtx); }
  16. void unlock_shared(void) { pthread_rwlock_unlock(&mtx); }
  17. private:
  18. pthread_rwlock_t mtx = PTHREAD_RWLOCK_INITIALIZER;
  19. bool locked = false;
  20. };
  21. template<class _Mutex> class shared_lock {
  22. public:
  23. shared_lock(_Mutex &m) : mtx(m), locked(true)
  24. {
  25. mtx.lock_shared();
  26. }
  27. ~shared_lock(void)
  28. {
  29. if (locked)
  30. mtx.unlock_shared();
  31. }
  32. void lock(void)
  33. {
  34. assert(!locked);
  35. mtx.lock_shared();
  36. locked = true;
  37. }
  38. void unlock(void)
  39. {
  40. assert(locked);
  41. mtx.unlock_shared();
  42. locked = false;
  43. }
  44. private:
  45. _Mutex &mtx;
  46. bool locked = false;
  47. };
  48. typedef std::lock_guard<std::mutex> scoped_lock;
  49. typedef std::lock_guard<std::recursive_mutex> scoped_rlock;
  50. typedef std::unique_lock<std::mutex> ulock_normal;
  51. typedef std::unique_lock<std::recursive_mutex> ulock_rec;
  52. } /* namespace */
  53. #endif /* KC_LOCKHELPER_HPP */