]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: Convert Lua records to SharedLockGuarded
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 4 Jun 2021 15:27:19 +0000 (17:27 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 18 Aug 2021 09:34:05 +0000 (11:34 +0200)
pdns/lua-record.cc

index d2d7ba3347bb14be576fd7861cbb36cd2bf54666..12c1f83dac471b557fbe547a5942b53d6c0363bd 100644 (file)
@@ -73,7 +73,6 @@ private:
     std::atomic<time_t> lastAccess{0};
   };
 
-  ReadWriteLock d_lock;
 public:
   IsUpOracle()
   {
@@ -158,8 +157,9 @@ private:
       std::vector<std::future<void>> results;
       std::vector<CheckDesc> toDelete;
       {
-        ReadLock lock{&d_lock}; // make sure there's no insertion
-        for (auto& it: d_statuses) {
+        // make sure there's no insertion
+        auto statuses = d_statuses.read_lock();
+        for (auto& it: *statuses) {
           auto& desc = it.first;
           auto& state = it.second;
 
@@ -178,9 +178,9 @@ private:
         future.wait();
       }
       if (!toDelete.empty()) {
-        WriteLock lock{&d_lock};
+        auto statuses = d_statuses.write_lock();
         for (auto& it: toDelete) {
-          d_statuses.erase(it);
+          statuses->erase(it);
         }
       }
       std::this_thread::sleep_until(checkStart + std::chrono::seconds(g_luaHealthChecksInterval));
@@ -188,14 +188,14 @@ private:
   }
 
   typedef map<CheckDesc, std::unique_ptr<CheckState>> statuses_t;
-  statuses_t d_statuses;
+  SharedLockGuarded<statuses_t> d_statuses;
 
   std::unique_ptr<std::thread> d_checkerThread;
 
   void setStatus(const CheckDesc& cd, bool status)
   {
-    ReadLock lock{&d_lock};
-    auto& state = d_statuses[cd];
+    auto statuses = d_statuses.write_lock();
+    auto& state = (*statuses)[cd];
     state->status = status;
     if (state->first) {
       state->first = false;
@@ -233,9 +233,9 @@ bool IsUpOracle::isUp(const CheckDesc& cd)
   }
   time_t now = time(nullptr);
   {
-    ReadLock lock{&d_lock};
-    auto iter = d_statuses.find(cd);
-    if (iter != d_statuses.end()) {
+    auto statuses = d_statuses.read_lock();
+    auto iter = statuses->find(cd);
+    if (iter != statuses->end()) {
       iter->second->lastAccess = now;
       return iter->second->status;
     }
@@ -245,10 +245,10 @@ bool IsUpOracle::isUp(const CheckDesc& cd)
     ComboAddress src(cd.opts.at("source"));
   }
   {
-    WriteLock lock{&d_lock};
+    auto statuses = d_statuses.write_lock();
     // Make sure we don't insert new entry twice now we have the lock
-    if (d_statuses.find(cd) == d_statuses.end()) {
-      d_statuses[cd] = std::unique_ptr<CheckState>(new CheckState{now});
+    if (statuses->find(cd) == statuses->end()) {
+      (*statuses)[cd] = std::unique_ptr<CheckState>(new CheckState{now});
     }
   }
   return false;