]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
logger: User thread_local instead of pthread_getspecific() 6625/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 18 May 2018 10:33:11 +0000 (12:33 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 18 May 2018 10:33:11 +0000 (12:33 +0200)
pdns/logger.cc
pdns/logger.hh

index 1766d35ae9a74aa52218bdbd2ead3a2511271f19..b1b0487fe443ba84e39f56433d4f3cbc9cce28cc 100644 (file)
@@ -31,10 +31,8 @@ extern StatBag S;
 #include "lock.hh"
 #include "namespaces.hh"
 
-pthread_once_t Logger::s_once;
-pthread_key_t Logger::g_loggerKey;
-
 Logger g_log("", LOG_DAEMON);
+thread_local Logger::PerThread Logger::t_perThread;
 
 void Logger::log(const string &msg, Urgency u)
 {
@@ -129,52 +127,29 @@ void Logger::setName(const string &_name)
   open();
 }
 
-void Logger::initKey()
-{
-  if(pthread_key_create(&g_loggerKey, perThreadDestructor))
-    unixDie("Creating thread key for logger");
-}
-
 Logger::Logger(const string &n, int facility) :
   name(n), flags(LOG_PID|LOG_NDELAY), d_facility(facility), d_loglevel(Logger::None),
   consoleUrgency(Error), opened(false), d_disableSyslog(false)
 {
-  if(pthread_once(&s_once, initKey))
-    unixDie("Creating thread key for logger");
-
   open();
 
 }
 
 Logger& Logger::operator<<(Urgency u)
 {
-  getPerThread()->d_urgency=u;
+  getPerThread().d_urgency=u;
   return *this;
 }
 
-void Logger::perThreadDestructor(void* buf)
+Logger::PerThread& Logger::getPerThread()
 {
-  PerThread* pt = (PerThread*) buf;
-  delete pt;
-}
-
-Logger::PerThread* Logger::getPerThread()
-{
-  void *buf=pthread_getspecific(g_loggerKey);
-  PerThread* ret;
-  if(buf)
-    ret = (PerThread*) buf;
-  else {
-    ret = new PerThread();
-    pthread_setspecific(g_loggerKey, (void*)ret);
-  }
-  return ret;
+  return t_perThread;
 }
 
 Logger& Logger::operator<<(const string &s)
 {
-  PerThread* pt =getPerThread();
-  pt->d_output.append(s);
+  PerThread& pt = getPerThread();
+  pt.d_output.append(s);
   return *this;
 }
 
@@ -244,11 +219,11 @@ Logger& Logger::operator<<(long i)
 
 Logger& Logger::operator<<(ostream & (&)(ostream &))
 {
-  PerThread* pt =getPerThread();
+  PerThread& pt = getPerThread();
 
-  log(pt->d_output, pt->d_urgency);
-  pt->d_output.clear();
-  pt->d_urgency=Info;
+  log(pt.d_output, pt.d_urgency);
+  pt.d_output.clear();
+  pt.d_urgency=Info;
   return *this;
 }
 
index 3fb97ee0fcf9ec8f079b3e6cd5d5a5929100efce..544a4d69d979b1fe62287bdf136eefc90e7894f0 100644 (file)
@@ -26,7 +26,6 @@
 #include <iostream>
 #include <sstream>
 #include <syslog.h>
-#include <pthread.h>
 
 #include "namespaces.hh"
 #include "dnsname.hh"
@@ -101,11 +100,10 @@ private:
     string d_output;
     Urgency d_urgency;
   };
-  static void initKey();
-  static void perThreadDestructor(void *);
-  PerThread* getPerThread();
+  PerThread& getPerThread();
   void open();
 
+  static thread_local PerThread t_perThread;
   string name;
   int flags;
   int d_facility;
@@ -115,8 +113,6 @@ private:
   bool d_disableSyslog;
   bool d_timestamps{true};
   bool d_prefixed{false};
-  static pthread_once_t s_once;
-  static pthread_key_t g_loggerKey;
 };
 
 extern Logger g_log;