From d90dad50b5717c3774ac0ddd47b51a52843a35b6 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Fri, 28 Jul 2017 15:34:03 +0200 Subject: [PATCH] Lock: Don't access and even less write to errno unless we have to POSIX.1c made `errno` a thread-local, meaning its performance is far worse than the one of a local variable. --- pdns/lock.hh | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/pdns/lock.hh b/pdns/lock.hh index 4a0c4a116..a20c2208f 100644 --- a/pdns/lock.hh +++ b/pdns/lock.hh @@ -40,8 +40,12 @@ public: { if(g_singleThreaded) return; - if((errno=pthread_mutex_lock(d_lock))) + + int err; + if((err = pthread_mutex_lock(d_lock))) { + errno = err; throw PDNSException("error acquiring lock: "+stringerror()); + } } ~Lock() { @@ -62,7 +66,9 @@ public: if(g_singleThreaded) return; - if((errno=pthread_rwlock_wrlock(d_lock))) { + int err; + if((err = pthread_rwlock_wrlock(d_lock))) { + errno = err; throw PDNSException("error acquiring rwlock wrlock: "+stringerror()); } } @@ -101,9 +107,12 @@ public: } d_havelock=false; - if((errno=pthread_rwlock_trywrlock(d_lock)) && errno!=EBUSY) + int err; + if((err = pthread_rwlock_trywrlock(d_lock)) && err!=EBUSY) { + errno = err; throw PDNSException("error acquiring rwlock tryrwlock: "+stringerror()); - d_havelock=(errno==0); + } + d_havelock=(err==0); } TryWriteLock(TryWriteLock&& rhs) @@ -145,9 +154,12 @@ public: return; } - if((errno=pthread_rwlock_tryrdlock(d_lock)) && errno!=EBUSY) + int err; + if((err = pthread_rwlock_tryrdlock(d_lock)) && err!=EBUSY) { + errno = err; throw PDNSException("error acquiring rwlock tryrdlock: "+stringerror()); - d_havelock=(errno==0); + } + d_havelock=(err==0); } TryReadLock(TryReadLock&& rhs) { @@ -183,8 +195,11 @@ public: if(g_singleThreaded) return; - if((errno=pthread_rwlock_rdlock(d_lock))) + int err; + if((err = pthread_rwlock_rdlock(d_lock))) { + errno = err; throw PDNSException("error acquiring rwlock readlock: "+stringerror()); + } } ~ReadLock() { -- 2.40.0