#include "misc.hh"
#include "pdnsexception.hh"
-extern bool g_singleThreaded;
-
class ReadWriteLock
{
public:
WriteLock(pthread_rwlock_t *lock) : d_lock(lock)
{
- if(g_singleThreaded)
- return;
-
int err;
if((err = pthread_rwlock_wrlock(d_lock))) {
throw PDNSException("error acquiring rwlock wrlock: "+stringerror(err));
}
~WriteLock()
{
- if(g_singleThreaded)
- return;
if(d_lock) // might have been moved
pthread_rwlock_unlock(d_lock);
}
TryWriteLock(pthread_rwlock_t *lock) : d_lock(lock)
{
- if(g_singleThreaded) {
- d_havelock=true;
- return;
- }
-
d_havelock=false;
int err;
if((err = pthread_rwlock_trywrlock(d_lock)) && err!=EBUSY) {
~TryWriteLock()
{
- if(g_singleThreaded)
- return;
-
if(d_havelock && d_lock) // we might be moved
pthread_rwlock_unlock(d_lock);
}
bool gotIt()
{
- if(g_singleThreaded)
- return true;
-
return d_havelock;
}
};
TryReadLock(pthread_rwlock_t *lock) : d_lock(lock)
{
- if(g_singleThreaded) {
- d_havelock=true;
- return;
- }
-
int err;
if((err = pthread_rwlock_tryrdlock(d_lock)) && err!=EBUSY) {
throw PDNSException("error acquiring rwlock tryrdlock: "+stringerror(err));
~TryReadLock()
{
- if(g_singleThreaded)
- return;
-
if(d_havelock && d_lock)
pthread_rwlock_unlock(d_lock);
}
bool gotIt()
{
- if(g_singleThreaded)
- return true;
-
return d_havelock;
}
};
ReadLock(pthread_rwlock_t *lock) : d_lock(lock)
{
- if(g_singleThreaded)
- return;
-
int err;
if((err = pthread_rwlock_rdlock(d_lock))) {
throw PDNSException("error acquiring rwlock readlock: "+stringerror(err));
~ReadLock()
{
- if(g_singleThreaded)
- return;
if(d_lock) // may have been moved
pthread_rwlock_unlock(d_lock);
}