14 #ifndef ABSL_SYNCHRONIZATION_INTERNAL_FUTEX_H_
15 #define ABSL_SYNCHRONIZATION_INTERNAL_FUTEX_H_
17 #include "absl/base/config.h"
27 #include <linux/futex.h>
28 #include <sys/syscall.h>
38 #include "absl/base/optimization.h"
39 #include "absl/synchronization/internal/kernel_timeout.h"
41 #ifdef ABSL_INTERNAL_HAVE_FUTEX
42 #error ABSL_INTERNAL_HAVE_FUTEX may not be set on the command line
43 #elif defined(__BIONIC__)
46 #define ABSL_INTERNAL_HAVE_FUTEX
47 #elif defined(__linux__) && defined(FUTEX_CLOCK_REALTIME)
49 #define ABSL_INTERNAL_HAVE_FUTEX
52 #ifdef ABSL_INTERNAL_HAVE_FUTEX
56 namespace synchronization_internal {
62 #define SYS_futex __NR_futex
64 #ifndef FUTEX_WAIT_BITSET
65 #define FUTEX_WAIT_BITSET 9
67 #ifndef FUTEX_PRIVATE_FLAG
68 #define FUTEX_PRIVATE_FLAG 128
70 #ifndef FUTEX_CLOCK_REALTIME
71 #define FUTEX_CLOCK_REALTIME 256
73 #ifndef FUTEX_BITSET_MATCH_ANY
74 #define FUTEX_BITSET_MATCH_ANY 0xFFFFFFFF
78 #if defined(__NR_futex_time64) && !defined(SYS_futex_time64)
79 #define SYS_futex_time64 __NR_futex_time64
82 #if defined(SYS_futex_time64) && !defined(SYS_futex)
83 #define SYS_futex SYS_futex_time64
91 if (
t.has_timeout()) {
94 struct timespec abs_timeout =
t.MakeAbsTimespec();
98 SYS_futex,
reinterpret_cast<int32_t *
>(
v),
99 FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME, val,
100 &abs_timeout,
nullptr, FUTEX_BITSET_MATCH_ANY);
105 FUTEX_WAIT | FUTEX_PRIVATE_FLAG, val,
nullptr);
113 static int WaitBitsetAbsoluteTimeout(std::atomic<int32_t> *
v,
int32_t val,
115 const struct timespec *abstime) {
117 FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG, val, abstime,
127 FUTEX_WAKE | FUTEX_PRIVATE_FLAG,
count);
137 FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG,
count,
nullptr,
146 class Futex :
public FutexImpl {};
152 #endif // ABSL_INTERNAL_HAVE_FUTEX
154 #endif // ABSL_SYNCHRONIZATION_INTERNAL_FUTEX_H_