From d3efccb33fa599d48004b22f2e07a19da4aaf789 Mon Sep 17 00:00:00 2001 From: Jung-uk Kim Date: Mon, 9 Dec 2013 18:35:45 -0500 Subject: Add support for FreeBSD using umtx (v3). This fixes a sign-extension bug in the previous versions. Signed-off-by: Jung-uk Kim Signed-off-by: Keith Packard --- configure.ac | 11 ++++++++++- src/xshmfence_futex.h | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index b855029..74b70e0 100644 --- a/configure.ac +++ b/configure.ac @@ -53,7 +53,16 @@ AC_ARG_ENABLE(futex, AS_HELP_STRING([--enable-futex], [Enable futexes (default: [FUTEX=$enableval], [FUTEX=auto]) if test "x$FUTEX" = "xauto"; then - AC_CHECK_HEADER([linux/futex.h], [FUTEX=yes], [FUTEX=no]) + AC_CHECK_HEADER([linux/futex.h], [FUTEX=yes]) +fi + +if test "x$FUTEX" = "xauto"; then + AC_CHECK_HEADER([sys/umtx.h], [FUTEX=yes], [FUTEX=no], + [#include + #include ]) + if test "x$FUTEX" = "xyes"; then + AC_DEFINE(HAVE_UMTX, 1, [Use umtx]) + fi fi if test "x$FUTEX" = "xyes"; then diff --git a/src/xshmfence_futex.h b/src/xshmfence_futex.h index ed60b6d..ea96cf4 100644 --- a/src/xshmfence_futex.h +++ b/src/xshmfence_futex.h @@ -1,5 +1,6 @@ /* * Copyright © 2013 Keith Packard + * Copyright © 2013 Jung-uk Kim * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -24,6 +25,27 @@ #define _XSHMFENCE_FUTEX_H_ #include + +#ifdef HAVE_UMTX + +#include +#include + +static inline int sys_futex(void *addr, int op, int32_t val) +{ + return _umtx_op(addr, op, (uint32_t)val, NULL, NULL) == -1 ? errno : 0; +} + +static inline int futex_wake(int32_t *addr) { + return sys_futex(addr, UMTX_OP_WAKE, INT_MAX); +} + +static inline int futex_wait(int32_t *addr, int32_t value) { + return sys_futex(addr, UMTX_OP_WAIT_UINT, value); +} + +#else + #include #include #include @@ -43,6 +65,8 @@ static inline int futex_wait(int32_t *addr, int32_t value) { return sys_futex(addr, FUTEX_WAIT, value, NULL, NULL, 0); } +#endif + #define barrier() __asm__ __volatile__("": : :"memory") static inline void atomic_store(int32_t *f, int32_t v) -- cgit v1.2.3