UnlockGuard.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. unlock(*m);
  46. }
  47. unlock_guard(unlock_guard &&other)
  48. : m(other.m)
  49. {
  50. other.m = NULL;
  51. }
  52. void release()
  53. {
  54. m = NULL;
  55. }
  56. ~unlock_guard()
  57. {
  58. if(m)
  59. lock(*m);
  60. }
  61. };
  62. template<typename Mutex>
  63. unlock_guard<Mutex, detail::unlock_policy<Mutex> > makeUnlockGuard(Mutex &m_)
  64. {
  65. return unlock_guard<Mutex, detail::unlock_policy<Mutex> >(m_);
  66. }
  67. template<typename Mutex>
  68. unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> > makeUnlockSharedGuard(Mutex &m_)
  69. {
  70. return unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> >(m_);
  71. }
  72. typedef unlock_guard<boost::shared_mutex, detail::unlock_shared_policy<boost::shared_mutex> > unlock_shared_guard;
  73. }