]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
make our Lock classes uncopyable, make ReadLock and WriteLock moveable.
authorbert hubert <bert.hubert@powerdns.com>
Tue, 28 Mar 2017 08:19:38 +0000 (10:19 +0200)
committerbert hubert <bert.hubert@powerdns.com>
Fri, 7 Apr 2017 12:21:13 +0000 (14:21 +0200)
pdns/lock.hh

index d0b1360142c0986c2fb8e60e598562204e2ffc1b..4d2d15467f0e04d3c6a1ebe7c5626ac3198c40ee 100644 (file)
@@ -33,6 +33,8 @@ class Lock
 {
   pthread_mutex_t *d_lock;
 public:
+  Lock(const Lock& rhs) = delete;
+  Lock& operator=(const Lock& rhs) = delete;
 
   Lock(pthread_mutex_t *lock) : d_lock(lock)
   {
@@ -68,9 +70,19 @@ public:
   {
     if(g_singleThreaded)
       return;
+    if(d_lock) // might have been moved
+      pthread_rwlock_unlock(d_lock);
+  }
 
-    pthread_rwlock_unlock(d_lock);
+  WriteLock(WriteLock&& rhs)
+  {
+    d_lock = rhs.d_lock;
+    rhs.d_lock=0;
   }
+  WriteLock(const WriteLock& rhs) = delete;
+  WriteLock& operator=(const WriteLock& rhs) = delete;
+
+
 };
 
 class TryWriteLock
@@ -78,6 +90,8 @@ class TryWriteLock
   pthread_rwlock_t *d_lock;
   bool d_havelock;
 public:
+  TryWriteLock(const TryWriteLock& rhs) = delete;
+  TryWriteLock& operator=(const TryWriteLock& rhs) = delete;
 
   TryWriteLock(pthread_rwlock_t *lock) : d_lock(lock)
   {
@@ -113,6 +127,8 @@ class TryReadLock
   pthread_rwlock_t *d_lock;
   bool d_havelock;
 public:
+  TryReadLock(const TryReadLock& rhs) = delete;
+  TryReadLock& operator=(const TryReadLock& rhs) = delete;
 
   TryReadLock(pthread_rwlock_t *lock) : d_lock(lock)
   {
@@ -154,15 +170,23 @@ public:
       return;
 
     if((errno=pthread_rwlock_rdlock(d_lock)))
-      throw PDNSException("error acquiring rwlock tryrwlock: "+stringerror());
+      throw PDNSException("error acquiring rwlock readlock: "+stringerror());
   }
   ~ReadLock()
   {
     if(g_singleThreaded)
       return;
+    if(d_lock) // may have been moved
+      pthread_rwlock_unlock(d_lock);
+  }
 
-    pthread_rwlock_unlock(d_lock);
+  ReadLock(ReadLock&& rhs)
+  {
+    d_lock = rhs.d_lock;
+    rhs.d_lock=0;
   }
+  ReadLock(const ReadLock& rhs) = delete;
+  ReadLock& operator=(const ReadLock& rhs) = delete;
   
   void upgrade()
   {