From 9000f73ba3fe64002eef042125e4a6b59f2e4aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Fri, 9 Nov 2018 00:49:05 +0700 Subject: [PATCH] Properly use ATOMIC_*_LOCK_FREE preprocessor constants The ATOMIC_*_LOCK_FREE can evalutate either 0, 1, or 2 which indicate the lock-free property of the corresponding atomic types (both signed and unsigned). Value Explanation ----- -------------------------------------- 0 The atomic type is never lock-free 1 The atomic type is sometimes lock-free 2 The atomic type is always lock-free ----- -------------------------------------- (cherry picked from commit a5e7901eb9dc7b00b4080924e309ff997eca3906) --- lib/isc/include/isc/refcount.h | 7 ++++--- lib/isc/include/isc/rwlock.h | 5 +++-- lib/isc/stats.c | 10 ++++++---- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/isc/include/isc/refcount.h b/lib/isc/include/isc/refcount.h index c911e5bf3e..c67399cf1c 100644 --- a/lib/isc/include/isc/refcount.h +++ b/lib/isc/include/isc/refcount.h @@ -99,9 +99,10 @@ ISC_LANG_BEGINDECLS * Sample implementations */ #ifdef ISC_PLATFORM_USETHREADS -#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD) +#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && ATOMIC_INT_LOCK_FREE == 2) || \ + defined(ISC_PLATFORM_HAVEXADD) #define ISC_REFCOUNT_HAVEATOMIC 1 -#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) +#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && ATOMIC_INT_LOCK_FREE == 2) #define ISC_REFCOUNT_HAVESTDATOMIC 1 #endif @@ -256,7 +257,7 @@ typedef struct isc_refcount { ISC_ERROR_RUNTIMECHECK(_result == ISC_R_SUCCESS); \ } while (0) -#endif /* (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD) */ +#endif /* (defined(ISC_PLATFORM_HAVESTDATOMIC) && ATOMIC_INT_LOCK_FREE == 2) || defined(ISC_PLATFORM_HAVEXADD) */ #else /* ISC_PLATFORM_USETHREADS */ typedef struct isc_refcount { diff --git a/lib/isc/include/isc/rwlock.h b/lib/isc/include/isc/rwlock.h index b9575090f7..eb71018e2a 100644 --- a/lib/isc/include/isc/rwlock.h +++ b/lib/isc/include/isc/rwlock.h @@ -39,9 +39,10 @@ typedef enum { } isc_rwlocktype_t; #ifdef ISC_PLATFORM_USETHREADS -#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || (defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG)) +#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && ATOMIC_INT_LOCK_FREE == 2) || \ + (defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG)) #define ISC_RWLOCK_USEATOMIC 1 -#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) +#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && ATOMIC_INT_LOCK_FREE == 2) #define ISC_RWLOCK_USESTDATOMIC 1 #endif #endif diff --git a/lib/isc/stats.c b/lib/isc/stats.c index 196099ee72..51a83b6514 100644 --- a/lib/isc/stats.c +++ b/lib/isc/stats.c @@ -43,10 +43,10 @@ * increment and store operations, just to make * the later macros simpler */ -#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_LONG_LOCK_FREE)) || \ +#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && ATOMIC_LONG_LOCK_FREE == 2) || \ (defined(ISC_PLATFORM_HAVEXADDQ) && defined(ISC_PLATFORM_HAVEATOMICSTOREQ)) #define ISC_STATS_HAVEATOMICQ 1 -#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_LONG_LOCK_FREE)) +#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && ATOMIC_LONG_LOCK_FREE == 2) #define ISC_STATS_HAVESTDATOMICQ 1 #endif #else @@ -76,9 +76,11 @@ * Otherwise, just rely on standard 64-bit data types * and operations */ -#if !ISC_STATS_HAVEATOMICQ && ((defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD)) +#if !ISC_STATS_HAVEATOMICQ && \ + ((defined(ISC_PLATFORM_HAVESTDATOMIC) && ATOMIC_INT_LOCK_FREE == 2) || \ + defined(ISC_PLATFORM_HAVEXADD)) #define ISC_STATS_USEMULTIFIELDS 1 -#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) +#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && ATOMIC_INT_LOCK_FREE == 2) #define ISC_STATS_HAVESTDATOMIC 1 #endif #else