]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add a basic lock in `RemoteLoggerInterface::queueData` for thread safety
authorEnsar Sarajčić <dev@ensarsarajcic.com>
Thu, 6 Feb 2025 08:29:20 +0000 (09:29 +0100)
committerEnsar Sarajčić <dev@ensarsarajcic.com>
Thu, 6 Feb 2025 08:29:20 +0000 (09:29 +0100)
pdns/remote_logger_pool.cc
pdns/remote_logger_pool.hh

index a730b125cc59a48a7e58a428cd86fbae4a2eb1de..b1b2bde611be329b2d42b5f2a65ff78e776593d4 100644 (file)
@@ -1,16 +1,15 @@
 #include <memory>
-#include <numeric>
 #include <string>
 #include <unistd.h>
 #include <sys/un.h>
 
 #include "config.h"
+#include "lock.hh"
 #include "remote_logger_pool.hh"
 
 RemoteLoggerPool::RemoteLoggerPool(std::vector<std::shared_ptr<RemoteLoggerInterface>>&& pool) :
-  d_pool(std::move(pool))
+  d_pool(std::move(pool)), d_pool_it(d_pool.begin())
 {
-  d_pool_it = d_pool.begin();
 }
 
 [[nodiscard]] std::string RemoteLoggerPool::toString()
@@ -28,10 +27,11 @@ RemoteLoggerPool::RemoteLoggerPool(std::vector<std::shared_ptr<RemoteLoggerInter
 
 RemoteLoggerInterface::Result RemoteLoggerPool::queueData(const std::string& data)
 {
-  auto result = (*d_pool_it)->queueData(data);
-  d_pool_it++;
-  if (d_pool_it == d_pool.end()) {
-    d_pool_it = d_pool.begin();
+  auto pool_it = d_pool_it.lock();
+  auto result = (**pool_it)->queueData(data);
+  (*pool_it)++;
+  if (*pool_it == d_pool.end()) {
+    *pool_it = d_pool.begin();
   }
   return result;
 }
index fdfe2f490854e70b4032c862f68dbe5597fd6201..4d6af2b026989fa9de39128e454ffe89115913f0 100644 (file)
@@ -21,6 +21,7 @@
  */
 #pragma once
 #include "config.h"
+#include "lock.hh"
 #include "remote_logger.hh"
 #include <memory>
 #include <vector>
@@ -58,5 +59,5 @@ public:
 
 private:
   std::vector<std::shared_ptr<RemoteLoggerInterface>> d_pool;
-  std::vector<std::shared_ptr<RemoteLoggerInterface>>::iterator d_pool_it;
+  LockGuarded<std::vector<std::shared_ptr<RemoteLoggerInterface>>::iterator> d_pool_it;
 };