From abb8813a3338ee63d28aa14b7dde74892fe1879f Mon Sep 17 00:00:00 2001 From: Mukund Sivaraman Date: Wed, 27 Sep 2017 15:08:06 +0530 Subject: [PATCH] Make isc_refcount_current() atomically read the counter value (#46074) --- CHANGES | 3 +++ lib/isc/include/isc/refcount.h | 12 +++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 5cb3e7252b..801c656160 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4741. [bug] Make isc_refcount_current() atomically read the + counter value. [RT #46074] + 4740. [cleanup] Avoid triggering format-truncated warnings. [RT #46107] 4739. [cleanup] Address clang static analysis warnings. [RT #45952] diff --git a/lib/isc/include/isc/refcount.h b/lib/isc/include/isc/refcount.h index acc9959962..24ad9dae94 100644 --- a/lib/isc/include/isc/refcount.h +++ b/lib/isc/include/isc/refcount.h @@ -104,11 +104,13 @@ typedef struct isc_refcount { #endif } isc_refcount_t; -#define isc_refcount_destroy(rp) REQUIRE((rp)->refs == 0) -#define isc_refcount_current(rp) ((unsigned int)((rp)->refs)) - #if defined(ISC_REFCOUNT_HAVESTDATOMIC) +#define isc_refcount_current(rp) \ + ((unsigned int)(atomic_load_explicit(&(rp)->refs, \ + memory_order_relaxed))) +#define isc_refcount_destroy(rp) REQUIRE(isc_refcount_current(rp) == 0) + #define isc_refcount_increment0(rp, tp) \ do { \ unsigned int *_tmp = (unsigned int *)(tp); \ @@ -143,6 +145,10 @@ typedef struct isc_refcount { #else /* ISC_REFCOUNT_HAVESTDATOMIC */ +#define isc_refcount_current(rp) \ + ((unsigned int)(isc_atomic_xadd(&(rp)->refs, 0))) +#define isc_refcount_destroy(rp) REQUIRE(isc_refcount_current(rp) == 0) + #define isc_refcount_increment0(rp, tp) \ do { \ unsigned int *_tmp = (unsigned int *)(tp); \