X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/8fc0752931ad7a8efa802b0a0f0246a2b50eca6b..4f48015e6f008575d6a6c59b9e6f78cb3c7c244b:/lib/base/elock.h diff --git a/lib/base/elock.h b/lib/base/elock.h index f886473b..51582e67 100644 --- a/lib/base/elock.h +++ b/lib/base/elock.h @@ -18,10 +18,70 @@ 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; pthread_mutex_t m_lock; + eSingleLock(eSingleLock &); public: eSingleLock() {