#pragma once
#include <mutex>
+#include <boost/multi_index_container.hpp>
+
+#include "dnsname.hh"
#include "lock.hh"
// this function can clean any cache that has a getTTD() method on its entries, a preRemoval() method and a 'sequence' index as its second index
moveCacheItemToFrontOrBack<S>(collection, iter, false);
}
-template <typename S, typename T> uint64_t pruneLockedCollectionsVector(vector<T>& maps)
+template <typename S, typename T> uint64_t pruneLockedCollectionsVector(std::vector<T>& maps)
{
uint64_t totErased = 0;
time_t now = time(nullptr);
return totErased;
}
-template <typename S, typename C, typename T> uint64_t pruneMutexCollectionsVector(C& container, vector<T>& maps, uint64_t maxCached, uint64_t cacheSize)
+template <typename S, typename C, typename T> uint64_t pruneMutexCollectionsVector(C& container, std::vector<T>& maps, uint64_t maxCached, uint64_t cacheSize)
{
time_t now = time(nullptr);
uint64_t totErased = 0;
return totErased;
}
-template <typename T> uint64_t purgeLockedCollectionsVector(vector<T>& maps)
+template <typename T> uint64_t purgeLockedCollectionsVector(std::vector<T>& maps)
{
uint64_t delcount=0;
return delcount;
}
-template <typename N, typename T> uint64_t purgeLockedCollectionsVector(vector<T>& maps, const std::string& match)
+template <typename N, typename T> uint64_t purgeLockedCollectionsVector(std::vector<T>& maps, const std::string& match)
{
uint64_t delcount=0;
- string prefix(match);
+ std::string prefix(match);
prefix.resize(prefix.size()-1);
DNSName dprefix(prefix);
for(auto& mc : maps) {
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once
-#include <pthread.h>
-#include <errno.h>
-#include "misc.hh"
-#include "pdnsexception.hh"
+#include <shared_mutex>
class ReadWriteLock
{
public:
ReadWriteLock()
{
- if (pthread_rwlock_init(&d_lock, nullptr) != 0) {
- throw std::runtime_error("Error creating a read-write lock: " + stringerror());
- }
- }
-
- ~ReadWriteLock() {
- pthread_rwlock_destroy(&d_lock);
}
ReadWriteLock(const ReadWriteLock& rhs) = delete;
+ ReadWriteLock(ReadWriteLock&& rhs) = delete;
ReadWriteLock& operator=(const ReadWriteLock& rhs) = delete;
- pthread_rwlock_t* getLock()
+ std::shared_mutex& getLock()
{
- return &d_lock;
+ return d_lock;
}
private:
- pthread_rwlock_t d_lock;
+ std::shared_mutex d_lock;
};
class ReadLock
{
}
- ~ReadLock()
- {
- if(d_lock) // may have been moved
- pthread_rwlock_unlock(d_lock);
- }
-
+ ReadLock(const ReadLock& rhs) = delete;
+ ReadLock& operator=(const ReadLock& rhs) = delete;
ReadLock(ReadLock&& rhs)
{
- d_lock = rhs.d_lock;
- rhs.d_lock = nullptr;
+ d_lock = std::move(rhs.d_lock);
}
- ReadLock(const ReadLock& rhs) = delete;
- ReadLock& operator=(const ReadLock& rhs) = delete;
private:
- ReadLock(pthread_rwlock_t *lock) : d_lock(lock)
+ ReadLock(std::shared_mutex& lock) : d_lock(lock)
{
- int err;
- if((err = pthread_rwlock_rdlock(d_lock))) {
- throw PDNSException("error acquiring rwlock readlock: "+stringerror(err));
- }
}
- pthread_rwlock_t *d_lock;
+ std::shared_lock<std::shared_mutex> d_lock;
};
class WriteLock
{
}
+ WriteLock(const WriteLock& rhs) = delete;
+ WriteLock& operator=(const WriteLock& rhs) = delete;
WriteLock(WriteLock&& rhs)
{
- d_lock = rhs.d_lock;
- rhs.d_lock=0;
+ d_lock = std::move(rhs.d_lock);
}
- ~WriteLock()
- {
- if(d_lock) // might have been moved
- pthread_rwlock_unlock(d_lock);
- }
-
- WriteLock(const WriteLock& rhs) = delete;
- WriteLock& operator=(const WriteLock& rhs) = delete;
-
private:
- WriteLock(pthread_rwlock_t *lock) : d_lock(lock)
+ WriteLock(std::shared_mutex& lock) : d_lock(lock)
{
- int err;
- if((err = pthread_rwlock_wrlock(d_lock))) {
- throw PDNSException("error acquiring rwlock wrlock: "+stringerror(err));
- }
}
- pthread_rwlock_t *d_lock;
+ std::unique_lock<std::shared_mutex> d_lock;
};
class TryReadLock
{
}
- TryReadLock(TryReadLock&& rhs)
- {
- d_lock = rhs.d_lock;
- rhs.d_lock = nullptr;
- d_havelock = rhs.d_havelock;
- rhs.d_havelock = false;
- }
-
- ~TryReadLock()
- {
- if(d_havelock && d_lock)
- pthread_rwlock_unlock(d_lock);
- }
-
TryReadLock(const TryReadLock& rhs) = delete;
TryReadLock& operator=(const TryReadLock& rhs) = delete;
- bool gotIt()
+ bool gotIt() const
{
- return d_havelock;
+ return d_lock.owns_lock();
}
private:
- TryReadLock(pthread_rwlock_t *lock) : d_lock(lock)
+ TryReadLock(std::shared_mutex& lock) : d_lock(lock, std::try_to_lock)
{
- int err;
- if((err = pthread_rwlock_tryrdlock(d_lock)) && err!=EBUSY) {
- throw PDNSException("error acquiring rwlock tryrdlock: "+stringerror(err));
- }
- d_havelock=(err==0);
}
- pthread_rwlock_t *d_lock;
- bool d_havelock;
+ std::shared_lock<std::shared_mutex> d_lock;
};
class TryWriteLock
{
}
- TryWriteLock(TryWriteLock&& rhs)
- {
- d_lock = rhs.d_lock;
- rhs.d_lock = nullptr;
- d_havelock = rhs.d_havelock;
- rhs.d_havelock = false;
- }
-
- ~TryWriteLock()
- {
- if(d_havelock && d_lock) // we might be moved
- pthread_rwlock_unlock(d_lock);
- }
-
TryWriteLock(const TryWriteLock& rhs) = delete;
TryWriteLock& operator=(const TryWriteLock& rhs) = delete;
- bool gotIt()
+ bool gotIt() const
{
- return d_havelock;
+ return d_lock.owns_lock();
}
private:
- TryWriteLock(pthread_rwlock_t *lock) : d_lock(lock)
+ TryWriteLock(std::shared_mutex& lock) : d_lock(lock, std::try_to_lock)
{
- d_havelock=false;
- int err;
- if((err = pthread_rwlock_trywrlock(d_lock)) && err!=EBUSY) {
- throw PDNSException("error acquiring rwlock tryrwlock: "+stringerror(err));
- }
- d_havelock=(err==0);
}
- pthread_rwlock_t *d_lock;
- bool d_havelock;
+ std::unique_lock<std::shared_mutex> d_lock;
};
-