]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Check isc_mutex_{lock,unlock}() return values in mutexatomic.h shim
authorOndřej Surý <ondrej@sury.org>
Mon, 15 Jul 2019 10:57:43 +0000 (12:57 +0200)
committerOndřej Surý <ondrej@sury.org>
Fri, 13 Sep 2019 08:55:14 +0000 (10:55 +0200)
lib/isc/include/isc/mutexatomic.h

index 31ecd3f2c0e8386ffe25e6b9dff13826e3af99d7..0de7a1dfb2595db56038f5ee795d3a0801b2fbc3 100644 (file)
@@ -100,23 +100,66 @@ typedef struct atomic_bool_s {
 } atomic_bool;
 
 
-#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)       \
-       ({ typeof((obj)->v) __v; isc_mutex_lock(&(obj)->m); __v= (obj)->v; isc_mutex_unlock(&(obj)->m); __v;} )
-#define atomic_store_explicit(obj, desired, order)     \
-       {isc_mutex_lock(&(obj)->m); (obj)->v = desired; isc_mutex_unlock(&(obj)->m); }
-#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_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;} )
-#define atomic_compare_exchange_strong_explicit(obj, expected, desired, succ, fail)    \
-       ({ 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;} )
-#define atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail)      \
-       ({ 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;} )
-
-
-
+#define atomic_init(obj, desired)                                      \
+       {                                                               \
+               isc_mutex_init(&(obj)->m);                              \
+               REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS);    \
+               (obj)->v = desired;                                     \
+               REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS);  \
+       }
+#define atomic_load_explicit(obj, order)                               \
+       ({                                                              \
+               typeof((obj)->v) ___v;                                  \
+               REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS);    \
+               ___v= (obj)->v;                                         \
+               REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS);  \
+               ___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) \
        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)
 #define atomic_fetch_sub(obj, arg) \
        atomic_fetch_sub_explicit(obj, arg, memory_order_seq_cst)
-#define atomic_compare_exchange_strong(obj, expected, desired) \
-       atomic_compare_exchange_strong_explicit(obj, expected, desired, 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)
+#define atomic_compare_exchange_strong(obj, expected, desired)         \
+       atomic_compare_exchange_strong_explicit(obj, expected, desired, \
+                                               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)