From 1e2f40d01b14569bb831e39542320b69402b383f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Tue, 4 Jun 2019 10:10:46 +0200 Subject: [PATCH 1/3] Fixup the atomic code in pthread_rwlock branch of lib/isc/rwlock.c --- lib/isc/rwlock.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/isc/rwlock.c b/lib/isc/rwlock.c index d756d663ab..9ec64c9262 100644 --- a/lib/isc/rwlock.c +++ b/lib/isc/rwlock.c @@ -53,10 +53,10 @@ isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { while (true) { REQUIRE(pthread_rwlock_wrlock(&rwl->rwlock) == 0); /* Unlock if in middle of downgrade operation */ - if (atomic_load_release(&rwl->downgrade)) { + if (atomic_load_acquire(&rwl->downgrade)) { REQUIRE(pthread_rwlock_unlock(&rwl->rwlock) == 0); - while (atomic_load(&rwl->downgrade)); + while (atomic_load_acquire(&rwl->downgrade)); continue; } break; @@ -78,7 +78,7 @@ isc_rwlock_trylock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { break; case isc_rwlocktype_write: ret = pthread_rwlock_trywrlock(&rwl->rwlock); - if ((ret == 0) && atomic_load(&rwl->downgrade)) { + if ((ret == 0) && atomic_load_acquire(&rwl->downgrade)) { isc_rwlock_unlock(rwl, type); return (ISC_R_LOCKBUSY); } @@ -104,15 +104,16 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { isc_result_t isc_rwlock_tryupgrade(isc_rwlock_t *rwl) { + UNUSED(rwl); return (ISC_R_LOCKBUSY); } void isc_rwlock_downgrade(isc_rwlock_t *rwl) { - atomic_store_acquire(&rwl->downgrade, true); + atomic_store_release(&rwl->downgrade, true); isc_rwlock_unlock(rwl, isc_rwlocktype_write); isc_rwlock_lock(rwl, isc_rwlocktype_read); - atomic_store_acquire(&rwl->downgrade, false); + atomic_store_release(&rwl->downgrade, false); } void From ac3d9b97a301866c538f9711b36cb3c40b5086e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Tue, 4 Jun 2019 10:13:45 +0200 Subject: [PATCH 2/3] Fix Windows build by moving #include to correct #ifdef block --- lib/isc/include/isc/rwlock.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/isc/include/isc/rwlock.h b/lib/isc/include/isc/rwlock.h index d1a4545339..f857c04dea 100644 --- a/lib/isc/include/isc/rwlock.h +++ b/lib/isc/include/isc/rwlock.h @@ -14,7 +14,6 @@ #define ISC_RWLOCK_H 1 #include -#include /*! \file isc/rwlock.h */ @@ -33,6 +32,7 @@ typedef enum { } isc_rwlocktype_t; #if USE_PTHREAD_RWLOCK +#include struct isc_rwlock { pthread_rwlock_t rwlock; From d45f9e413f281710fb890b2c189214d3c1709432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Tue, 4 Jun 2019 21:53:15 +0200 Subject: [PATCH 3/3] Enforce pthread rwlock to be only enabled in developer mode --- configure | 4 ++++ configure.ac | 3 +++ 2 files changed, 7 insertions(+) diff --git a/configure b/configure index 9a13d5f954..b097723ece 100755 --- a/configure +++ b/configure @@ -15649,6 +15649,10 @@ $as_echo "#define USE_PTHREAD_RWLOCK 1" >>confdefs.h fi +if test "$enable_pthread_rwlock" = "yes" -a "$enable_developer" != "yes"; then : + as_fn_error $? "pthread rwlock is not meant used in production and the developer mode must be enabled" "$LINENO" 5 +fi + CRYPTO=OpenSSL # diff --git a/configure.ac b/configure.ac index 7064846004..db2c524ea3 100644 --- a/configure.ac +++ b/configure.ac @@ -747,6 +747,9 @@ AS_IF([test "$enable_pthread_rwlock" = "yes"], AC_DEFINE([USE_PTHREAD_RWLOCK],[1],[Define if you want to use pthread rwlock implementation]) ]) +AS_IF([test "$enable_pthread_rwlock" = "yes" -a "$enable_developer" != "yes"], + [AC_MSG_ERROR([pthread rwlock is not meant used in production and the developer mode must be enabled])]) + CRYPTO=OpenSSL #