mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 06:55:30 +00:00
Check isc_mutex_{lock,unlock}() return values in mutexatomic.h shim
This commit is contained in:
@@ -100,23 +100,66 @@ typedef struct atomic_bool_s {
|
|||||||
} atomic_bool;
|
} atomic_bool;
|
||||||
|
|
||||||
|
|
||||||
#define atomic_init(obj, desired) \
|
#define atomic_init(obj, desired) \
|
||||||
{ isc_mutex_init(&(obj)->m); isc_mutex_lock(&(obj)->m); (obj)->v = desired; isc_mutex_unlock(&(obj)->m); }
|
{ \
|
||||||
#define atomic_load_explicit(obj, order) \
|
isc_mutex_init(&(obj)->m); \
|
||||||
({ typeof((obj)->v) __v; isc_mutex_lock(&(obj)->m); __v= (obj)->v; isc_mutex_unlock(&(obj)->m); __v;} )
|
REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
#define atomic_store_explicit(obj, desired, order) \
|
(obj)->v = desired; \
|
||||||
{isc_mutex_lock(&(obj)->m); (obj)->v = desired; isc_mutex_unlock(&(obj)->m); }
|
REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
#define atomic_fetch_add_explicit(obj, arg, order) \
|
}
|
||||||
({ typeof((obj)->v) __v; isc_mutex_lock(&(obj)->m); __v= (obj)->v; (obj)->v += arg; isc_mutex_unlock(&(obj)->m); __v;} )
|
#define atomic_load_explicit(obj, order) \
|
||||||
#define atomic_fetch_sub_explicit(obj, arg, order) \
|
({ \
|
||||||
({ typeof((obj)->v) __v; isc_mutex_lock(&(obj)->m); __v= (obj)->v; (obj)->v -= arg; isc_mutex_unlock(&(obj)->m); __v;} )
|
typeof((obj)->v) ___v; \
|
||||||
#define atomic_compare_exchange_strong_explicit(obj, expected, desired, succ, fail) \
|
REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
({ bool __v; isc_mutex_lock(&(obj)->m); __v = ((obj)->v == *expected); *expected = (obj)->v; (obj)->v = __v ? desired : (obj)->v; isc_mutex_unlock(&(obj)->m); __v;} )
|
___v= (obj)->v; \
|
||||||
#define atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail) \
|
REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
({ bool __v; isc_mutex_lock(&(obj)->m); __v = ((obj)->v == *expected); *expected = (obj)->v; (obj)->v = __v ? desired : (obj)->v; isc_mutex_unlock(&(obj)->m); __v;} )
|
___v; \
|
||||||
|
})
|
||||||
|
#define atomic_store_explicit(obj, desired, order) \
|
||||||
|
{ \
|
||||||
|
REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
(obj)->v = desired; \
|
||||||
|
REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
}
|
||||||
|
#define atomic_fetch_add_explicit(obj, arg, order) \
|
||||||
|
({ \
|
||||||
|
typeof((obj)->v) ___v; \
|
||||||
|
REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
___v= (obj)->v; \
|
||||||
|
(obj)->v += arg; \
|
||||||
|
REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
___v;\
|
||||||
|
})
|
||||||
|
#define atomic_fetch_sub_explicit(obj, arg, order) \
|
||||||
|
({ typeof((obj)->v) ___v; \
|
||||||
|
REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
___v= (obj)->v; \
|
||||||
|
(obj)->v -= arg; \
|
||||||
|
REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
___v;\
|
||||||
|
})
|
||||||
|
#define atomic_compare_exchange_strong_explicit(obj, expected, desired, \
|
||||||
|
succ, fail) \
|
||||||
|
({ \
|
||||||
|
bool ___v; \
|
||||||
|
REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
___v = ((obj)->v == *expected); \
|
||||||
|
*expected = (obj)->v; \
|
||||||
|
(obj)->v = ___v ? desired : (obj)->v; \
|
||||||
|
REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
___v; \
|
||||||
|
})
|
||||||
|
#define atomic_compare_exchange_weak_explicit(obj, expected, desired, \
|
||||||
|
succ, fail) \
|
||||||
|
({ \
|
||||||
|
bool ___v; \
|
||||||
|
REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
___v = ((obj)->v == *expected); \
|
||||||
|
*expected = (obj)->v; \
|
||||||
|
(obj)->v = ___v ? desired : (obj)->v; \
|
||||||
|
REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS); \
|
||||||
|
___v; \
|
||||||
|
})
|
||||||
|
|
||||||
#define atomic_load(obj) \
|
#define atomic_load(obj) \
|
||||||
atomic_load_explicit(obj, memory_order_seq_cst)
|
atomic_load_explicit(obj, memory_order_seq_cst)
|
||||||
@@ -126,7 +169,11 @@ typedef struct atomic_bool_s {
|
|||||||
atomic_fetch_add_explicit(obj, arg, memory_order_seq_cst)
|
atomic_fetch_add_explicit(obj, arg, memory_order_seq_cst)
|
||||||
#define atomic_fetch_sub(obj, arg) \
|
#define atomic_fetch_sub(obj, arg) \
|
||||||
atomic_fetch_sub_explicit(obj, arg, memory_order_seq_cst)
|
atomic_fetch_sub_explicit(obj, arg, memory_order_seq_cst)
|
||||||
#define atomic_compare_exchange_strong(obj, expected, desired) \
|
#define atomic_compare_exchange_strong(obj, expected, desired) \
|
||||||
atomic_compare_exchange_strong_explicit(obj, expected, desired, memory_order_seq_cst, memory_order_seq_cst)
|
atomic_compare_exchange_strong_explicit(obj, expected, desired, \
|
||||||
#define atomic_compare_exchange_weak(obj, expected, desired) \
|
memory_order_seq_cst, \
|
||||||
atomic_compare_exchange_weak_explicit(obj, expected, desired, memory_order_seq_cst, memory_order_seq_cst)
|
memory_order_seq_cst)
|
||||||
|
#define atomic_compare_exchange_weak(obj, expected, desired) \
|
||||||
|
atomic_compare_exchange_weak_explicit(obj, expected, desired, \
|
||||||
|
memory_order_seq_cst, \
|
||||||
|
memory_order_seq_cst)
|
||||||
|
Reference in New Issue
Block a user