diff options
Diffstat (limited to 'src/xshmfence_futex.h')
-rw-r--r-- | src/xshmfence_futex.h | 24 |
1 files changed, 24 insertions, 0 deletions
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 <jkim@FreeBSD.org> * * 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 <errno.h> + +#ifdef HAVE_UMTX + +#include <sys/types.h> +#include <sys/umtx.h> + +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 <stdint.h> #include <values.h> #include <linux/futex.h> @@ -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) |