123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /*
- * UnlockGuard.h, part of VCMI engine
- *
- * Authors: listed in file AUTHORS in main folder
- *
- * License: GNU General Public License v2.0 or later
- * Full text of license available in license.txt file, in main folder
- *
- */
-
- #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_)
- {
- this->unlock(*m);
- }
- unlock_guard()
- {
- m = nullptr;
- }
- unlock_guard(unlock_guard &&other)
- : m(other.m)
- {
- other.m = nullptr;
- }
- void release()
- {
- m = nullptr;
- }
- ~unlock_guard()
- {
- if(m)
- this->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_policy<Mutex> > makeEmptyGuard(Mutex &)
- {
- return unlock_guard<Mutex, detail::unlock_policy<Mutex> >();
- }
- template<typename Mutex>
- unlock_guard<Mutex, detail::unlock_policy<Mutex> > makeUnlockGuardIf(Mutex &m_, bool shallUnlock)
- {
- return shallUnlock
- ? makeUnlockGuard(m_)
- : unlock_guard<Mutex, detail::unlock_policy<Mutex> >();
- }
- template<typename Mutex>
- unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> > makeUnlockSharedGuard(Mutex &m_)
- {
- return unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> >(m_);
- }
- template<typename Mutex>
- unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> > makeUnlockSharedGuardIf(Mutex &m_, bool shallUnlock)
- {
- return shallUnlock
- ? makeUnlockSharedGuard(m_)
- : unlock_guard<Mutex, detail::unlock_shared_policy<Mutex> >();
- }
- typedef unlock_guard<boost::shared_mutex, detail::unlock_shared_policy<boost::shared_mutex> > unlock_shared_guard;
- }
|