]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Replace locks in `remote_logger_pool` with an atomic counter
authorEnsar Sarajčić <dev@ensarsarajcic.com>
Fri, 7 Feb 2025 11:33:29 +0000 (12:33 +0100)
committerEnsar Sarajčić <dev@ensarsarajcic.com>
Fri, 7 Feb 2025 11:33:29 +0000 (12:33 +0100)
pdns/remote_logger_pool.cc
pdns/remote_logger_pool.hh

index 8e1c2685417a156894c6875de5034ecec38c780d..6b59bbaddc4817c68919a8d82f6c88d8b35be90e 100644 (file)
@@ -8,7 +8,7 @@
 #include "remote_logger_pool.hh"
 
 RemoteLoggerPool::RemoteLoggerPool(std::vector<std::shared_ptr<RemoteLoggerInterface>>&& pool) :
-  d_pool(std::move(pool)), d_pool_it(d_pool.begin())
+  d_pool(std::move(pool)), d_counter(0)
 {
 }
 
@@ -27,14 +27,6 @@ RemoteLoggerPool::RemoteLoggerPool(std::vector<std::shared_ptr<RemoteLoggerInter
 
 RemoteLoggerInterface::Result RemoteLoggerPool::queueData(const std::string& data)
 {
-  std::shared_ptr<RemoteLoggerInterface> logger;
-  {
-    auto pool_it = d_pool_it.lock();
-    logger = **pool_it;
-    (*pool_it)++;
-    if (*pool_it == d_pool.end()) {
-      *pool_it = d_pool.begin();
-    }
-  }
+  std::shared_ptr<RemoteLoggerInterface> logger = d_pool.at(d_counter++ % d_pool.size());
   return logger->queueData(data);
 }
index 4d6af2b026989fa9de39128e454ffe89115913f0..0a203305a2fe7a85a448016e7efb6873aad75803 100644 (file)
  */
 #pragma once
 #include "config.h"
-#include "lock.hh"
 #include "remote_logger.hh"
+#include <atomic>
+#include <cstddef>
 #include <memory>
 #include <vector>
 
 class RemoteLoggerPool : public RemoteLoggerInterface
 {
 public:
+  // this expects a non-empty vector
   RemoteLoggerPool(std::vector<std::shared_ptr<RemoteLoggerInterface>>&& pool);
   RemoteLoggerPool(const RemoteLoggerPool&) = delete;
   RemoteLoggerPool(RemoteLoggerPool&&) = delete;
@@ -59,5 +61,5 @@ public:
 
 private:
   std::vector<std::shared_ptr<RemoteLoggerInterface>> d_pool;
-  LockGuarded<std::vector<std::shared_ptr<RemoteLoggerInterface>>::iterator> d_pool_it;
+  std::atomic<size_t> d_counter;
 };