Use umtx for futex, and SHM_ANON for memfd. Also use temp files as memfd fallback for other OSes.
Obtained from: FreeBSD ports --- src/intel/vulkan/anv_allocator.c | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c index 33bd3c68c5..c31d3d17d2 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -25,7 +25,13 @@ #include <unistd.h> #include <limits.h> #include <assert.h> +#ifdef __linux__ #include <linux/memfd.h> +#elif __FreeBSD__ +#include <errno.h> +#include <fcntl.h> +#include <sys/umtx.h> +#endif #include <sys/mman.h> #include "anv_private.h" @@ -50,6 +56,34 @@ #define VG_NOACCESS_WRITE(__ptr, __val) (*(__ptr) = (__val)) #endif +#ifdef __FreeBSD__ +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(uint32_t *addr, int count) +{ + return sys_futex(addr, UMTX_OP_WAKE, count); +} + +static inline int +futex_wait(uint32_t *addr, int32_t value, int32_t _) +{ + return sys_futex(addr, UMTX_OP_WAIT_UINT, value); +} +#endif + +#ifndef MAP_POPULATE +#define MAP_POPULATE 0 +#endif + +#ifndef MFD_CLOEXEC +#define MFD_CLOEXEC O_CLOEXEC +#endif + /* Design goals: * * - Lock free (except when resizing underlying bos) @@ -113,7 +147,29 @@ struct anv_mmap_cleanup { static inline int memfd_create(const char *name, unsigned int flags) { +#if defined(__linux__) return syscall(SYS_memfd_create, name, flags); +#elif defined(__FreeBSD__) + return shm_open(SHM_ANON, flags | O_RDWR | O_CREAT, 0600); +#else /* DragonFly, NetBSD, OpenBSD, Solaris */ + char template[] = "/tmp/shmfd-XXXXXX"; +#ifdef HAVE_MKOSTEMP + int fd = mkostemp(template, flags); +#else + int fd = mkstemp(template); + if (flags & O_CLOEXEC) { + int flags = fcntl(fd, F_GETFD); + if (flags != -1) { + flags |= FD_CLOEXEC; + (void) fcntl(fd, F_SETFD, &flags); + } + } +#endif /* HAVE_MKOSTEMP */ + if (fd >= 0) + unlink(template); + + return fd; +#endif /* __linux__ */ } #endif -- 2.15.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev