* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef LOCK_HH
-#define LOCK_HH
-
+#pragma once
#include <pthread.h>
#include <errno.h>
#include "misc.hh"
}
};
+class ReadWriteLock
+{
+public:
+ ReadWriteLock()
+ {
+ if (pthread_rwlock_init(&d_lock, nullptr) != 0) {
+ throw std::runtime_error("Error creating a read-write lock: " + stringerror());
+ }
+ }
+
+ ~ReadWriteLock() {
+ /* might have been moved */
+ pthread_rwlock_destroy(&d_lock);
+ }
+
+ ReadWriteLock(const ReadWriteLock& rhs) = delete;
+ ReadWriteLock& operator=(const ReadWriteLock& rhs) = delete;
+
+ pthread_rwlock_t* getLock()
+ {
+ return &d_lock;
+ }
+
+private:
+ pthread_rwlock_t d_lock;
+};
+
class WriteLock
{
pthread_rwlock_t *d_lock;
int err;
if((err = pthread_rwlock_wrlock(d_lock))) {
- errno = err;
- throw PDNSException("error acquiring rwlock wrlock: "+stringerror());
+ throw PDNSException("error acquiring rwlock wrlock: "+stringerror(err));
}
}
~WriteLock()
pthread_rwlock_unlock(d_lock);
}
+ WriteLock(ReadWriteLock& lock): WriteLock(lock.getLock())
+ {
+ }
+
+ WriteLock(ReadWriteLock* lock): WriteLock(lock->getLock())
+ {
+ }
+
WriteLock(WriteLock&& rhs)
{
d_lock = rhs.d_lock;
WriteLock(const WriteLock& rhs) = delete;
WriteLock& operator=(const WriteLock& rhs) = delete;
-
};
class TryWriteLock
d_havelock=false;
int err;
if((err = pthread_rwlock_trywrlock(d_lock)) && err!=EBUSY) {
- errno = err;
- throw PDNSException("error acquiring rwlock tryrwlock: "+stringerror());
+ throw PDNSException("error acquiring rwlock tryrwlock: "+stringerror(err));
}
d_havelock=(err==0);
}
TryWriteLock(TryWriteLock&& rhs)
{
d_lock = rhs.d_lock;
- rhs.d_lock=0;
+ rhs.d_lock = nullptr;
+ d_havelock = rhs.d_havelock;
+ rhs.d_havelock = false;
+ }
+
+ TryWriteLock(ReadWriteLock& lock): TryWriteLock(lock.getLock())
+ {
+ }
+
+ TryWriteLock(ReadWriteLock* lock): TryWriteLock(lock->getLock())
+ {
}
-
~TryWriteLock()
{
if(g_singleThreaded)
int err;
if((err = pthread_rwlock_tryrdlock(d_lock)) && err!=EBUSY) {
- errno = err;
- throw PDNSException("error acquiring rwlock tryrdlock: "+stringerror());
+ throw PDNSException("error acquiring rwlock tryrdlock: "+stringerror(err));
}
d_havelock=(err==0);
}
+
+ TryReadLock(ReadWriteLock& lock): TryReadLock(lock.getLock())
+ {
+ }
+
+ TryReadLock(ReadWriteLock* lock): TryReadLock(lock->getLock())
+ {
+ }
+
TryReadLock(TryReadLock&& rhs)
{
d_lock = rhs.d_lock;
- rhs.d_lock=0;
+ rhs.d_lock = nullptr;
+ d_havelock = rhs.d_havelock;
+ rhs.d_havelock = false;
}
~TryReadLock()
int err;
if((err = pthread_rwlock_rdlock(d_lock))) {
- errno = err;
- throw PDNSException("error acquiring rwlock readlock: "+stringerror());
+ throw PDNSException("error acquiring rwlock readlock: "+stringerror(err));
}
}
+
+ ReadLock(ReadWriteLock& lock): ReadLock(lock.getLock())
+ {
+ }
+
+ ReadLock(ReadWriteLock* lock): ReadLock(lock->getLock())
+ {
+ }
+
~ReadLock()
{
if(g_singleThreaded)
ReadLock(ReadLock&& rhs)
{
d_lock = rhs.d_lock;
- rhs.d_lock=0;
+ rhs.d_lock = nullptr;
}
ReadLock(const ReadLock& rhs) = delete;
ReadLock& operator=(const ReadLock& rhs) = delete;
};
-#endif