Enforce stdatomic.h usage
This commit is contained in:
@@ -292,7 +292,7 @@
|
||||
* If <stdatomic.h> is available on this architecture,
|
||||
* ISC_PLATFORM_HAVESTDATOMIC will be defined.
|
||||
*/
|
||||
@ISC_PLATFORM_HAVESTDATOMIC@
|
||||
#define ISC_PLATFORM_HAVESTDATOMIC 1
|
||||
|
||||
/*
|
||||
* Define if gcc ASM extension is available
|
||||
|
||||
@@ -20,11 +20,7 @@
|
||||
#include <isc/platform.h>
|
||||
#include <isc/types.h>
|
||||
|
||||
#if defined(ISC_PLATFORM_HAVESTDATOMIC)
|
||||
#include <stdatomic.h>
|
||||
#else
|
||||
#include <isc/atomic.h>
|
||||
#endif
|
||||
|
||||
/*! \file isc/refcount.h
|
||||
* \brief Implements a locked reference counter.
|
||||
@@ -93,22 +89,12 @@ ISC_LANG_BEGINDECLS
|
||||
/*
|
||||
* Sample implementations
|
||||
*/
|
||||
#ifdef ISC_PLATFORM_USETHREADS
|
||||
#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD)
|
||||
#define ISC_REFCOUNT_HAVEATOMIC 1
|
||||
#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE))
|
||||
#define ISC_REFCOUNT_HAVESTDATOMIC 1
|
||||
#endif
|
||||
|
||||
typedef struct isc_refcount {
|
||||
#if defined(ISC_REFCOUNT_HAVESTDATOMIC)
|
||||
atomic_int_fast32_t refs;
|
||||
#else
|
||||
isc_int32_t refs;
|
||||
#endif
|
||||
} isc_refcount_t;
|
||||
|
||||
#if defined(ISC_REFCOUNT_HAVESTDATOMIC)
|
||||
#define isc_refcount_init(rp, n) atomic_init(&(rp)->refs, n)
|
||||
|
||||
#define isc_refcount_current(rp) \
|
||||
((unsigned int)(atomic_load_explicit(&(rp)->refs, \
|
||||
@@ -152,159 +138,6 @@ typedef struct isc_refcount {
|
||||
*_tmp = prev - 1; \
|
||||
} while (0)
|
||||
|
||||
#else /* ISC_REFCOUNT_HAVESTDATOMIC */
|
||||
|
||||
#define isc_refcount_init(rp, n) isc_atomic_store(&(rp)->refs, n)
|
||||
|
||||
#define isc_refcount_current(rp) \
|
||||
((unsigned int)(isc_atomic_xadd(&(rp)->refs, 0)))
|
||||
#define isc_refcount_destroy(rp) ISC_REQUIRE(isc_refcount_current(rp) == 0)
|
||||
|
||||
#define isc_refcount_increment0(rp, tp) \
|
||||
do { \
|
||||
unsigned int *_tmp = (unsigned int *)(tp); \
|
||||
isc_int32_t prev; \
|
||||
prev = isc_atomic_xadd(&(rp)->refs, 1); \
|
||||
if (_tmp != NULL) \
|
||||
*_tmp = prev + 1; \
|
||||
} while (0)
|
||||
|
||||
#define isc_refcount_increment(rp, tp) \
|
||||
do { \
|
||||
unsigned int *_tmp = (unsigned int *)(tp); \
|
||||
isc_int32_t prev; \
|
||||
prev = isc_atomic_xadd(&(rp)->refs, 1); \
|
||||
ISC_REQUIRE(prev > 0); \
|
||||
if (_tmp != NULL) \
|
||||
*_tmp = prev + 1; \
|
||||
} while (0)
|
||||
|
||||
#define isc_refcount_decrement(rp, tp) \
|
||||
do { \
|
||||
unsigned int *_tmp = (unsigned int *)(tp); \
|
||||
isc_int32_t prev; \
|
||||
prev = isc_atomic_xadd(&(rp)->refs, -1); \
|
||||
ISC_REQUIRE(prev > 0); \
|
||||
if (_tmp != NULL) \
|
||||
*_tmp = prev - 1; \
|
||||
} while (0)
|
||||
|
||||
#endif /* ISC_REFCOUNT_HAVESTDATOMIC */
|
||||
|
||||
#else /* ISC_PLATFORM_HAVEXADD */
|
||||
|
||||
typedef struct isc_refcount {
|
||||
int refs;
|
||||
isc_mutex_t lock;
|
||||
} isc_refcount_t;
|
||||
|
||||
#define isc_refcount_init(rp, n) \
|
||||
do { \
|
||||
REQUIRE(isc_mutex_init(&ref->lock) == ISC_R_SUCCESS); \
|
||||
(rp)->refs = n; \
|
||||
} while(0);
|
||||
|
||||
/*% Destroys a reference counter. */
|
||||
#define isc_refcount_destroy(rp) \
|
||||
do { \
|
||||
isc_result_t _result; \
|
||||
ISC_REQUIRE((rp)->refs == 0); \
|
||||
_result = isc_mutex_destroy(&(rp)->lock); \
|
||||
ISC_ERROR_RUNTIMECHECK(_result == ISC_R_SUCCESS); \
|
||||
} while (0)
|
||||
|
||||
#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
|
||||
|
||||
/*%
|
||||
* Increments the reference count, returning the new value in
|
||||
* 'tp' if it's not NULL.
|
||||
*/
|
||||
#define isc_refcount_increment0(rp, tp) \
|
||||
do { \
|
||||
isc_result_t _result; \
|
||||
unsigned int *_tmp = (unsigned int *)(tp); \
|
||||
_result = isc_mutex_lock(&(rp)->lock); \
|
||||
ISC_ERROR_RUNTIMECHECK(_result == ISC_R_SUCCESS); \
|
||||
++((rp)->refs); \
|
||||
if (_tmp != NULL) \
|
||||
*_tmp = ((rp)->refs); \
|
||||
_result = isc_mutex_unlock(&(rp)->lock); \
|
||||
ISC_ERROR_RUNTIMECHECK(_result == ISC_R_SUCCESS); \
|
||||
} while (0)
|
||||
|
||||
#define isc_refcount_increment(rp, tp) \
|
||||
do { \
|
||||
isc_result_t _result; \
|
||||
unsigned int *_tmp = (unsigned int *)(tp); \
|
||||
_result = isc_mutex_lock(&(rp)->lock); \
|
||||
ISC_ERROR_RUNTIMECHECK(_result == ISC_R_SUCCESS); \
|
||||
ISC_REQUIRE((rp)->refs > 0); \
|
||||
++((rp)->refs); \
|
||||
if (_tmp != NULL) \
|
||||
*_tmp = ((rp)->refs); \
|
||||
_result = isc_mutex_unlock(&(rp)->lock); \
|
||||
ISC_ERROR_RUNTIMECHECK(_result == ISC_R_SUCCESS); \
|
||||
} while (0)
|
||||
|
||||
/*%
|
||||
* Decrements the reference count, returning the new value in 'tp'
|
||||
* if it's not NULL.
|
||||
*/
|
||||
#define isc_refcount_decrement(rp, tp) \
|
||||
do { \
|
||||
isc_result_t _result; \
|
||||
unsigned int *_tmp = (unsigned int *)(tp); \
|
||||
_result = isc_mutex_lock(&(rp)->lock); \
|
||||
ISC_ERROR_RUNTIMECHECK(_result == ISC_R_SUCCESS); \
|
||||
ISC_REQUIRE((rp)->refs > 0); \
|
||||
--((rp)->refs); \
|
||||
if (_tmp != NULL) \
|
||||
*_tmp = ((rp)->refs); \
|
||||
_result = isc_mutex_unlock(&(rp)->lock); \
|
||||
ISC_ERROR_RUNTIMECHECK(_result == ISC_R_SUCCESS); \
|
||||
} while (0)
|
||||
|
||||
#endif /* (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE)) || defined(ISC_PLATFORM_HAVEXADD) */
|
||||
#else /* ISC_PLATFORM_USETHREADS */
|
||||
|
||||
typedef struct isc_refcount {
|
||||
int refs;
|
||||
} isc_refcount_t;
|
||||
|
||||
#define isc_refcount_init(rp, n) ((rp)->refs = n)
|
||||
#define isc_refcount_destroy(rp) ISC_REQUIRE((rp)->refs == 0)
|
||||
#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
|
||||
|
||||
#define isc_refcount_increment0(rp, tp) \
|
||||
do { \
|
||||
unsigned int *_tmp = (unsigned int *)(tp); \
|
||||
int _n = ++(rp)->refs; \
|
||||
if (_tmp != NULL) \
|
||||
*_tmp = _n; \
|
||||
} while (0)
|
||||
|
||||
#define isc_refcount_increment(rp, tp) \
|
||||
do { \
|
||||
unsigned int *_tmp = (unsigned int *)(tp); \
|
||||
int _n; \
|
||||
ISC_REQUIRE((rp)->refs > 0); \
|
||||
_n = ++(rp)->refs; \
|
||||
if (_tmp != NULL) \
|
||||
*_tmp = _n; \
|
||||
} while (0)
|
||||
|
||||
#define isc_refcount_decrement(rp, tp) \
|
||||
do { \
|
||||
unsigned int *_tmp = (unsigned int *)(tp); \
|
||||
int _n; \
|
||||
ISC_REQUIRE((rp)->refs > 0); \
|
||||
_n = --(rp)->refs; \
|
||||
if (_tmp != NULL) \
|
||||
*_tmp = _n; \
|
||||
} while (0)
|
||||
|
||||
#endif /* ISC_PLATFORM_USETHREADS */
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
|
||||
#endif /* ISC_REFCOUNT_H */
|
||||
|
||||
@@ -20,10 +20,8 @@
|
||||
#include <isc/platform.h>
|
||||
#include <isc/types.h>
|
||||
|
||||
#if defined(ISC_PLATFORM_HAVESTDATOMIC)
|
||||
#include <stdint.h>
|
||||
#include <stdatomic.h>
|
||||
#endif
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
@@ -34,12 +32,8 @@ 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))
|
||||
#define ISC_RWLOCK_USEATOMIC 1
|
||||
#if (defined(ISC_PLATFORM_HAVESTDATOMIC) && defined(ATOMIC_INT_LOCK_FREE))
|
||||
#define ISC_RWLOCK_USESTDATOMIC 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct isc_rwlock {
|
||||
/* Unlocked. */
|
||||
|
||||
Reference in New Issue
Block a user