aboutsummaryrefslogtreecommitdiffstats
path: root/src/util/futex.h
diff options
context:
space:
mode:
authorJonathan Gray <[email protected]>2019-12-01 02:19:38 +1100
committerMarek Olšák <[email protected]>2019-12-02 17:23:49 -0500
commitc91997b6c4395831a8de2b84e6ea2ff981a00e4b (patch)
tree3c3d87359f0e83f49b9c21193438666ee1e745b8 /src/util/futex.h
parentdbe923bff99cfca4f192db3b9ea88cd19ee7af85 (diff)
util/futex: use futex syscall on OpenBSD
Make use of the futex syscall added in OpenBSD 6.2. Signed-off-by: Jonathan Gray <[email protected]> Signed-off-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/util/futex.h')
-rw-r--r--src/util/futex.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/util/futex.h b/src/util/futex.h
index 268af92882a..cf8dd0206c9 100644
--- a/src/util/futex.h
+++ b/src/util/futex.h
@@ -85,6 +85,24 @@ static inline int futex_wait(uint32_t *addr, int32_t value, struct timespec *tim
return _umtx_op(addr, UMTX_OP_WAIT_UINT, (uint32_t)value, uaddr, uaddr2) == -1 ? errno : 0;
}
+#elif defined(__OpenBSD__)
+
+#include <sys/time.h>
+#include <sys/futex.h>
+
+static inline int futex_wake(uint32_t *addr, int count)
+{
+ return futex(addr, FUTEX_WAKE, count, NULL, NULL);
+}
+
+static inline int futex_wait(uint32_t *addr, int32_t value, const struct timespec *timeout)
+{
+ struct timespec tsrel, tsnow;
+ clock_gettime(CLOCK_MONOTONIC, &tsnow);
+ timespecsub(timeout, &tsrel, &tsrel);
+ return futex(addr, FUTEX_WAIT, value, &tsrel, NULL);
+}
+
#endif
#endif /* UTIL_FUTEX_H */