futex.h: Use urcu_posix_assert to validate unused values
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 3 Jun 2024 14:10:49 +0000 (10:10 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 3 Jun 2024 14:10:49 +0000 (10:10 -0400)
When building on FreeBSD, uaddr2 and val3 are unused. Add a
urcu_posix_assert() to validate that they are zero and hence allow users
of the API to quickly figure out that those are not effectively used.

When building on OpenBSD, val3 is unused. Add a urcu_posix_assert() to
validate that it is zero.

Those asserts are already present in the compat code. Use the same
mechanism to prevent users from expecting futex arguments to be used
when they are in fact discarded.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I4e69d240c6f07da471e6af083854440c060ef53b

include/urcu/futex.h

index b219835e0925b9d5b8e3ad64cc3e288b233fac2c..f4c115a4c2f61aec15fd82eafbc9a0b18481a61a 100644 (file)
@@ -25,6 +25,7 @@
 #include <errno.h>
 #include <urcu/compiler.h>
 #include <urcu/arch.h>
+#include <urcu/assert.h>
 
 #elif defined(__FreeBSD__)
 
@@ -71,8 +72,7 @@ extern int compat_futex_async(int32_t *uaddr, int op, int32_t val,
 static inline int futex(int32_t *uaddr, int op, int32_t val,
                const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
 {
-       return syscall(__NR_futex, uaddr, op, val, timeout,
-                       uaddr2, val3);
+       return syscall(__NR_futex, uaddr, op, val, timeout, uaddr2, val3);
 }
 
 static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
@@ -114,9 +114,7 @@ static inline int futex_async(int32_t *uaddr, int op, int32_t val,
 #elif defined(__FreeBSD__)
 
 static inline int futex_async(int32_t *uaddr, int op, int32_t val,
-               const struct timespec *timeout,
-               int32_t *uaddr2 __attribute__((unused)),
-               int32_t val3 __attribute__((unused)))
+               const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
 {
        int umtx_op;
        void *umtx_uaddr = NULL, *umtx_uaddr2 = NULL;
@@ -125,6 +123,13 @@ static inline int futex_async(int32_t *uaddr, int op, int32_t val,
                ._clockid = CLOCK_MONOTONIC,
        };
 
+       /*
+        * Check if NULL or zero. Don't let users expect that they are
+        * taken into account.
+        */
+       urcu_posix_assert(!uaddr2);
+       urcu_posix_assert(!val3);
+
        switch (op) {
        case FUTEX_WAIT:
                /* On FreeBSD, a "u_int" is a 32-bit integer. */
@@ -160,6 +165,12 @@ static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
 {
        int ret;
 
+       /*
+        * Check that val3 is zero. Don't let users expect that it is
+        * taken into account.
+        */
+       urcu_posix_assert(!val3);
+
        ret = futex((volatile uint32_t *) uaddr, op, val, timeout,
                (volatile uint32_t *) uaddr2);
        if (caa_unlikely(ret < 0 && errno == ENOSYS)) {
@@ -174,6 +185,12 @@ static inline int futex_async(int32_t *uaddr, int op, int32_t val,
 {
        int ret;
 
+       /*
+        * Check that val3 is zero. Don't let users expect that it is
+        * taken into account.
+        */
+       urcu_posix_assert(!val3);
+
        ret = futex((volatile uint32_t *) uaddr, op, val, timeout,
                (volatile uint32_t *) uaddr2);
        if (caa_unlikely(ret < 0 && errno == ENOSYS)) {
This page took 0.02645 seconds and 4 git commands to generate.