]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: Wrap a few more missed pthread_ objects
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 28 Apr 2020 13:33:47 +0000 (15:33 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 28 Apr 2020 13:40:09 +0000 (15:40 +0200)
modules/geoipbackend/geoipbackend.cc
modules/geoipbackend/geoipbackend.hh
modules/gmysqlbackend/smysql.cc
modules/gmysqlbackend/smysql.hh
modules/tinydnsbackend/tinydnsbackend.cc
modules/tinydnsbackend/tinydnsbackend.hh
pdns/common_startup.cc
pdns/dynlistener.cc
pdns/dynlistener.hh
pdns/test-lock_hh.cc

index d812efa31504669740d53be5d90d650c17778e1f..612c9a5298a7605ef1bcce5d784f0ebb7ce092cd 100644 (file)
@@ -32,7 +32,7 @@
 #include <fstream>
 #include <yaml-cpp/yaml.h>
 
-pthread_rwlock_t GeoIPBackend::s_state_lock=PTHREAD_RWLOCK_INITIALIZER;
+ReadWriteLock GeoIPBackend::s_state_lock;
 
 struct GeoIPDNSResourceRecord: DNSResourceRecord {
   int weight;
index 1b885117bcd9a4cfae29b588cc3079229772beaa..a45bbda4e54ae0972b105cbbcbbca7fad200940a 100644 (file)
@@ -67,7 +67,7 @@ public:
   bool unpublishDomainKey(const DNSName& name, unsigned int id) override;
 
 private:
-  static pthread_rwlock_t s_state_lock;
+  static ReadWriteLock s_state_lock;
 
   void initialize();
   string format2str(string format, const Netmask &addr, GeoIPNetmask& gl);
index f792089a70605769119b398f48a5ee091d5d93dd..6f2cb0dab660a32f3c8cecf6a7e74b51ff9e853a 100644 (file)
@@ -65,7 +65,7 @@ private:
 static thread_local MySQLThreadCloser threadcloser;
 
 bool SMySQL::s_dolog;
-pthread_mutex_t SMySQL::s_myinitlock = PTHREAD_MUTEX_INITIALIZER;
+std::mutex SMySQL::s_myinitlock;
 
 class SMySQLStatement: public SSqlStatement
 {
@@ -440,7 +440,7 @@ void SMySQL::connect()
 {
   int retry=1;
 
-  Lock l(&s_myinitlock);
+  std::lock_guard<std::mutex> l(s_myinitlock);
   if (d_threadCleanup) {
     threadcloser.enable();
   }
index 74c5a4bc302f2c0317a2f15f1ec807dd7f830d13..50780e9c51a1957a68fe00acfda103040f5f44d5 100644 (file)
@@ -20,6 +20,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 #pragma once
+#include <mutex>
+
 #include <mysql.h>
 #include "pdns/backends/gsql/ssql.hh"
 #include "pdns/utility.hh"
@@ -48,7 +50,7 @@ private:
   void connect();
 
   static bool s_dolog;
-  static pthread_mutex_t s_myinitlock;
+  static std::mutex s_myinitlock;
 
   MYSQL d_db;
   std::string d_database;
index 72e31c61d29e50707802af721aa00f0b3b562d67..3f77b0e2f8a76816c771300278e6c21b73be1abe 100644 (file)
@@ -29,7 +29,7 @@
 
 static string backendname="[TinyDNSBackend] ";
 uint32_t TinyDNSBackend::s_lastId;
-pthread_mutex_t TinyDNSBackend::s_domainInfoLock=PTHREAD_MUTEX_INITIALIZER;
+std::mutex TinyDNSBackend::s_domainInfoLock;
 TinyDNSBackend::TDI_suffix_t TinyDNSBackend::s_domainInfo;
 
 vector<string> TinyDNSBackend::getLocations()
@@ -90,7 +90,7 @@ TinyDNSBackend::TinyDNSBackend(const string &suffix)
 }
 
 void TinyDNSBackend::getUpdatedMasters(vector<DomainInfo>* retDomains) {
-  Lock l(&s_domainInfoLock); //TODO: We could actually lock less if we do it per suffix.
+  std::lock_guard<std::mutex> l(s_domainInfoLock); //TODO: We could actually lock less if we do it per suffix.
 
   if (! s_domainInfo.count(d_suffix)) {
     TDI_t tmp;
@@ -133,7 +133,7 @@ void TinyDNSBackend::getUpdatedMasters(vector<DomainInfo>* retDomains) {
 }
 
 void TinyDNSBackend::setNotified(uint32_t id, uint32_t serial) {
-  Lock l(&s_domainInfoLock);
+  std::lock_guard<std::mutex> l(s_domainInfoLock);
   if (!s_domainInfo.count(d_suffix)) {
     throw PDNSException("Can't get list of domains to set the serial.");
   }
index 5029546714523831585b75cd4374f8e556e2b247..ecf28e075ee27ad44240dd907388e3aba610c27b 100644 (file)
@@ -32,6 +32,7 @@
 #include <boost/multi_index_container.hpp>
 #include <boost/multi_index/hashed_index.hpp>
 #include <boost/multi_index/member.hpp>
+#include <mutex>
 
 using namespace ::boost;
 using namespace ::boost::multi_index;
@@ -102,7 +103,7 @@ private:
   string d_suffix;
 
   // Statics
-  static pthread_mutex_t s_domainInfoLock;
+  static std::mutex s_domainInfoLock;
   static TDI_suffix_t s_domainInfo;
   static uint32_t s_lastId; // used to give a domain an id.
 };
index da3c8e337153e386f30219efe87c24e6bdd674d0..18553ed5082b68da79ece245d61eec04a35eecba 100644 (file)
@@ -506,18 +506,14 @@ catch(PDNSException& pe)
   _exit(1);
 }
 
-static void* dummyThread(void *)
+static void dummyThread()
 {
-  void* ignore=0;
-  pthread_exit(ignore);
 }
 
 static void triggerLoadOfLibraries()
 {
-  pthread_t tid;
-  pthread_create(&tid, 0, dummyThread, 0);
-  void* res;
-  pthread_join(tid, &res);
+  std::thread dummy(dummyThread);
+  dummy.join();
 }
 
 void mainthread()
index 2deb2182b928a970e842e1b917cbd330792b03c3..ab10d114dadc0adb4ced1f138a6e11e8cc4364c0 100644 (file)
@@ -28,7 +28,6 @@
 #include <sys/types.h>
 #include <sys/un.h>
 #include <dlfcn.h>
-#include <pthread.h>
 #include <unistd.h>
 #include <boost/algorithm/string.hpp>
 
@@ -43,6 +42,8 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <boost/algorithm/string.hpp> 
+#include <thread>
+
 #include "misc.hh"
 #include "dns.hh"
 #include "arguments.hh"
@@ -203,16 +204,8 @@ DynListener::DynListener(const string &progname)
 void DynListener::go()
 {
   d_ppid=getpid();
-  pthread_create(&d_tid,0,&DynListener::theListenerHelper,this);
-}
-
-void *DynListener::theListenerHelper(void *p)
-{
-  setThreadName("pdns/ctrlListen");
-  DynListener *us=static_cast<DynListener *>(p);
-  us->theListener();
-  g_log<<Logger::Error<<"Control listener aborted, please file a bug!"<<endl;
-  return 0;
+  std::thread listener(std::bind(&DynListener::theListener,this));
+  listener.detach();
 }
 
 string DynListener::getLine()
@@ -331,6 +324,8 @@ void DynListener::registerRestFunc(g_funk_t *gf)
 
 void DynListener::theListener()
 {
+  setThreadName("pdns/ctrlListen");
+
   try {
     signal(SIGPIPE,SIG_IGN);
 
index da61661ccb4c8bbfa8852137b26383211e05bff4..cbe45c47b53ab1f03d6a69a7dcc5216597bd78b2 100644 (file)
@@ -22,7 +22,6 @@
 #pragma once
 #include <string>
 #include <vector>
-#include <pthread.h>
 #include <sys/types.h>
 #include <errno.h>
 #include <iostream>
@@ -45,7 +44,6 @@ public:
   ~DynListener();
   void go();
   void theListener();
-  static void *theListenerHelper(void *p);
 
   typedef string g_funk_t(const vector<string> &parts, Utility::pid_t ppid); // guido!
   typedef struct { g_funk_t *func; string args; string usage; } g_funkwithusage_t;
@@ -66,7 +64,6 @@ private:
   NetmaskGroup d_tcprange;
   int d_s{-1};
   int d_client{-1};
-  pthread_t d_tid{0};
   bool d_nonlocal;
   bool d_tcp{false};
   pid_t d_ppid{0};
index bdd3697504c735a5c8425f10df709d774e2c641d..46e844c60aa20905b8ae4258d8c9a3ce201865c1 100644 (file)
@@ -11,26 +11,20 @@ using namespace boost;
 
 BOOST_AUTO_TEST_SUITE(test_lock_hh)
 
-static std::vector<std::unique_ptr<pthread_rwlock_t> > g_locks;
+static std::vector<ReadWriteLock> g_locks(1000);
 
 static void lthread()
 {
   std::vector<ReadLock> rlocks;
   for(auto& pp : g_locks)
-    rlocks.emplace_back(&*pp);
+    rlocks.emplace_back(pp);
 }
 
 BOOST_AUTO_TEST_CASE(test_pdns_lock)
 {
-  for(unsigned int n=0; n < 1000; ++n) {
-    auto p = make_unique<pthread_rwlock_t>();
-    pthread_rwlock_init(p.get(), 0);
-    g_locks.emplace_back(std::move(p));
-  }
-
   std::vector<ReadLock> rlocks;
   for(auto& pp : g_locks)
-    rlocks.emplace_back(&*pp);
+    rlocks.emplace_back(pp);
 
   std::thread thr(lthread);
   thr.join();
@@ -38,13 +32,13 @@ BOOST_AUTO_TEST_CASE(test_pdns_lock)
 
   std::vector<WriteLock> wlocks;
   for(auto& pp : g_locks)
-    wlocks.emplace_back(&*pp);
+    wlocks.emplace_back(pp);
 
   // on macOS, this TryReadLock throws (EDEADLK) instead of simply failing
   // so we catch the exception and consider that success for this test
   bool gotit = false;
   try {
-    TryReadLock trl(&*g_locks[0]);
+    TryReadLock trl(g_locks.at(0));
     gotit = trl.gotIt();
   }
   catch(const PDNSException &e) {
@@ -55,13 +49,11 @@ BOOST_AUTO_TEST_CASE(test_pdns_lock)
   wlocks.clear();
 
   {
-    TryReadLock trl2(&*g_locks[0]);
+    TryReadLock trl2(g_locks.at(0));
     BOOST_CHECK(trl2.gotIt());
   }
 
-  for(auto& pp : g_locks) {
-    pthread_rwlock_destroy(pp.get());
-  }
+  g_locks.clear();
 }
 
 BOOST_AUTO_TEST_SUITE_END()