+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]
#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); \
#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); \