| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #pragma once
- namespace vstd
- {
- namespace detail
- {
- template<typename Mutex>
- class unlock_policy
- {
- protected:
- void unlock(Mutex &m)
- {
- m.unlock();
- }
- void lock(Mutex &m)
- {
- m.lock();
- }
- };
- template<typename Mutex>
- class unlock_shared_policy
- {
- protected:
- void unlock(Mutex &m)
- {
- m.unlock_shared();
- }
- void lock(Mutex &m)
- {
- m.lock_shared();
- }
- };
- }
- //similar to boost::lock_guard but UNlocks for the scope + assertions
- template<typename Mutex, typename LockingPolicy = detail::unlock_policy<Mutex> >
- class unlock_guard : LockingPolicy
- {
- private:
- Mutex* m;
- explicit unlock_guard(unlock_guard&);
- unlock_guard& operator=(unlock_guard&);
- public:
- explicit unlock_guard(Mutex& m_):
- m(&m_)
- {
- unlock(*m);
- }
- unlock_guard(unlock_guard &&other)
- : m(other.m)
- {
- other.m = NULL;
- }
- void release()
- {
- m = NULL;
- }
- ~unlock_guard()
- {
- if(m)
- lock(*m);
- }
- };
- template<typename Mutex>
- unlock_guard<Mutex, detail::unlock_policy<Mutex> > makeUnlockGuard(Mutex &m_)
- {
- return unlock_guard<Mutex, detail::unlock_policy<Mutex> >(m_);
- }
- template<typename Mutex>
- unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> > makeUnlockSharedGuard(Mutex &m_)
- {
- return unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> >(m_);
- }
- typedef unlock_guard<boost::shared_mutex, detail::unlock_shared_policy<boost::shared_mutex> > unlock_shared_guard;
- }
|