--- man2/futex.2 | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/man2/futex.2 b/man2/futex.2 index 0d5f69fe8..adb8dab89 100644 --- a/man2/futex.2 +++ b/man2/futex.2 @@ -1756,6 +1756,7 @@ Child (18535) 4 #define _GNU_SOURCE #include <stdio.h> #include <errno.h> +#include <stdatomic.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> @@ -1785,22 +1786,19 @@ fwait(int *futexp) { int s; - /* __sync_bool_compare_and_swap(ptr, oldval, newval) is a gcc - built\-in function. It atomically performs the equivalent of: + /* atomic_compare_exchange_strong(ptr, oldval, newval) + atomically performs the equivalent of: - if (*ptr == oldval) + if (*ptr == *oldval) *ptr = newval; - It returns true if the test yielded true and *ptr was updated. - The alternative here would be to employ the equivalent atomic - machine\-language instructions. For further information, see - the GCC Manual. */ + It returns true if the test yielded true and *ptr was updated. */ while (1) { /* Is the futex available? */ - - if (__sync_bool_compare_and_swap(futexp, 1, 0)) + const int zero = 0; + if (atomic_compare_exchange_strong(futexp, &zero, 1)) break; /* Yes */ /* Futex is not available; wait */ @@ -1820,10 +1818,10 @@ fpost(int *futexp) { int s; - /* __sync_bool_compare_and_swap() was described in comments above */ - - if (__sync_bool_compare_and_swap(futexp, 0, 1)) { + /* atomic_compare_exchange_strong() was described in comments above */ + const int one = 1; + if (atomic_compare_exchange_strong(futexp, &one, 0)) { s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0); if (s == \-1) errExit("futex\-FUTEX_WAKE"); -- 2.19.1