X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/e366c245644f158ea862b85deb78b731dc8f008a..371e23c22dcec461ee3fbc8c989859cd08717b3d:/lib/base/elock.h diff --git a/lib/base/elock.h b/lib/base/elock.h index 7bf25eba..51582e67 100644 --- a/lib/base/elock.h +++ b/lib/base/elock.h @@ -18,6 +18,65 @@ public: } }; +class eRdWrLock +{ + friend class eRdLocker; + friend class eWrLocker; + pthread_rwlock_t m_lock; + eRdWrLock(eRdWrLock &); +public: + eRdWrLock() + { + pthread_rwlock_init(&m_lock, 0); + } + ~eRdWrLock() + { + pthread_rwlock_destroy(&m_lock); + } + void RdLock() + { + pthread_rwlock_rdlock(&m_lock); + } + void WrLock() + { + pthread_rwlock_wrlock(&m_lock); + } + void Unlock() + { + pthread_rwlock_unlock(&m_lock); + } +}; + +class eRdLocker +{ + eRdWrLock &m_lock; +public: + eRdLocker(eRdWrLock &m) + : m_lock(m) + { + pthread_rwlock_rdlock(&m_lock.m_lock); + } + ~eRdLocker() + { + pthread_rwlock_unlock(&m_lock.m_lock); + } +}; + +class eWrLocker +{ + eRdWrLock &m_lock; +public: + eWrLocker(eRdWrLock &m) + : m_lock(m) + { + pthread_rwlock_wrlock(&m_lock.m_lock); + } + ~eWrLocker() + { + pthread_rwlock_unlock(&m_lock.m_lock); + } +}; + class eSingleLock { friend class eSingleLocker;