UnlockGuard.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #pragma once
  2. namespace vstd
  3. {
  4. namespace detail
  5. {
  6. template<typename Mutex>
  7. class unlock_policy
  8. {
  9. protected:
  10. void unlock(Mutex &m)
  11. {
  12. m.unlock();
  13. }
  14. void lock(Mutex &m)
  15. {
  16. m.lock();
  17. }
  18. };
  19. template<typename Mutex>
  20. class unlock_shared_policy
  21. {
  22. protected:
  23. void unlock(Mutex &m)
  24. {
  25. m.unlock_shared();
  26. }
  27. void lock(Mutex &m)
  28. {
  29. m.lock_shared();
  30. }
  31. };
  32. }
  33. //similar to boost::lock_guard but UNlocks for the scope + assertions
  34. template<typename Mutex, typename LockingPolicy = detail::unlock_policy<Mutex> >
  35. class unlock_guard : LockingPolicy
  36. {
  37. private:
  38. Mutex* m;
  39. explicit unlock_guard(unlock_guard&);
  40. unlock_guard& operator=(unlock_guard&);
  41. public:
  42. explicit unlock_guard(Mutex& m_):
  43. m(&m_)
  44. {
  45. this->unlock(*m);
  46. }
  47. unlock_guard()
  48. {
  49. m = NULL;
  50. }
  51. unlock_guard(unlock_guard &&other)
  52. : m(other.m)
  53. {
  54. other.m = NULL;
  55. }
  56. void release()
  57. {
  58. m = NULL;
  59. }
  60. ~unlock_guard()
  61. {
  62. if(m)
  63. this->lock(*m);
  64. }
  65. };
  66. template<typename Mutex>
  67. unlock_guard<Mutex, detail::unlock_policy<Mutex> > makeUnlockGuard(Mutex &m_)
  68. {
  69. return unlock_guard<Mutex, detail::unlock_policy<Mutex> >(m_);
  70. }
  71. template<typename Mutex>
  72. unlock_guard<Mutex, detail::unlock_policy<Mutex> > makeEmptyGuard(Mutex &)
  73. {
  74. return unlock_guard<Mutex, detail::unlock_policy<Mutex> >();
  75. }
  76. template<typename Mutex>
  77. unlock_guard<Mutex, detail::unlock_policy<Mutex> > makeUnlockGuardIf(Mutex &m_, bool shallUnlock)
  78. {
  79. return shallUnlock
  80. ? makeUnlockGuard(m_)
  81. : unlock_guard<Mutex, detail::unlock_policy<Mutex> >();
  82. }
  83. template<typename Mutex>
  84. unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> > makeUnlockSharedGuard(Mutex &m_)
  85. {
  86. return unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> >(m_);
  87. }
  88. template<typename Mutex>
  89. unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> > makeUnlockSharedGuardIf(Mutex &m_, bool shallUnlock)
  90. {
  91. return shallUnlock
  92. ? makeUnlockSharedGuard(m_)
  93. : unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> >();
  94. }
  95. typedef unlock_guard<boost::shared_mutex, detail::unlock_shared_policy<boost::shared_mutex> > unlock_shared_guard;
  96. }