xshmfence_futex.h revision fbc03982
1ed6f5d66Smrg/* 2ed6f5d66Smrg * Copyright © 2013 Keith Packard 3ed6f5d66Smrg * Copyright © 2013 Jung-uk Kim <jkim@FreeBSD.org> 4ed6f5d66Smrg * 5ed6f5d66Smrg * Permission to use, copy, modify, distribute, and sell this software and its 6ed6f5d66Smrg * documentation for any purpose is hereby granted without fee, provided that 7ed6f5d66Smrg * the above copyright notice appear in all copies and that both that copyright 8ed6f5d66Smrg * notice and this permission notice appear in supporting documentation, and 9ed6f5d66Smrg * that the name of the copyright holders not be used in advertising or 10ed6f5d66Smrg * publicity pertaining to distribution of the software without specific, 11ed6f5d66Smrg * written prior permission. The copyright holders make no representations 12ed6f5d66Smrg * about the suitability of this software for any purpose. It is provided "as 13ed6f5d66Smrg * is" without express or implied warranty. 14ed6f5d66Smrg * 15ed6f5d66Smrg * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 16ed6f5d66Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 17ed6f5d66Smrg * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 18ed6f5d66Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 19ed6f5d66Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 20ed6f5d66Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 21ed6f5d66Smrg * OF THIS SOFTWARE. 22ed6f5d66Smrg */ 23ed6f5d66Smrg 24ed6f5d66Smrg#ifndef _XSHMFENCE_FUTEX_H_ 25ed6f5d66Smrg#define _XSHMFENCE_FUTEX_H_ 26ed6f5d66Smrg 27ed6f5d66Smrg#include <errno.h> 28ed6f5d66Smrg 29ed6f5d66Smrg#ifdef HAVE_UMTX 30ed6f5d66Smrg 31ed6f5d66Smrg#include <sys/types.h> 32ed6f5d66Smrg#include <sys/umtx.h> 33fbc03982Smrg#include <limits.h> 34ed6f5d66Smrg 35ed6f5d66Smrgstatic inline int sys_futex(void *addr, int op, int32_t val) 36ed6f5d66Smrg{ 37ed6f5d66Smrg return _umtx_op(addr, op, (uint32_t)val, NULL, NULL) == -1 ? errno : 0; 38ed6f5d66Smrg} 39ed6f5d66Smrg 40ed6f5d66Smrgstatic inline int futex_wake(int32_t *addr) { 41ed6f5d66Smrg return sys_futex(addr, UMTX_OP_WAKE, INT_MAX); 42ed6f5d66Smrg} 43ed6f5d66Smrg 44ed6f5d66Smrgstatic inline int futex_wait(int32_t *addr, int32_t value) { 45ed6f5d66Smrg return sys_futex(addr, UMTX_OP_WAIT_UINT, value); 46ed6f5d66Smrg} 47ed6f5d66Smrg 48ed6f5d66Smrg#else 49ed6f5d66Smrg 50ed6f5d66Smrg#include <stdint.h> 51ed6f5d66Smrg#include <values.h> 52ed6f5d66Smrg#include <linux/futex.h> 53ed6f5d66Smrg#include <sys/time.h> 54ed6f5d66Smrg#include <sys/syscall.h> 55ed6f5d66Smrg 56ed6f5d66Smrgstatic inline long sys_futex(void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3) 57ed6f5d66Smrg{ 58ed6f5d66Smrg return syscall(SYS_futex, addr1, op, val1, timeout, addr2, val3); 59ed6f5d66Smrg} 60ed6f5d66Smrg 61ed6f5d66Smrgstatic inline int futex_wake(int32_t *addr) { 62ed6f5d66Smrg return sys_futex(addr, FUTEX_WAKE, MAXINT, NULL, NULL, 0); 63ed6f5d66Smrg} 64ed6f5d66Smrg 65ed6f5d66Smrgstatic inline int futex_wait(int32_t *addr, int32_t value) { 66ed6f5d66Smrg return sys_futex(addr, FUTEX_WAIT, value, NULL, NULL, 0); 67ed6f5d66Smrg} 68ed6f5d66Smrg 69ed6f5d66Smrg#endif 70ed6f5d66Smrg 71ed6f5d66Smrg#define barrier() __asm__ __volatile__("": : :"memory") 72ed6f5d66Smrg 73ed6f5d66Smrgstatic inline void atomic_store(int32_t *f, int32_t v) 74ed6f5d66Smrg{ 75ed6f5d66Smrg barrier(); 76ed6f5d66Smrg *f = v; 77ed6f5d66Smrg barrier(); 78ed6f5d66Smrg} 79ed6f5d66Smrg 80ed6f5d66Smrgstatic inline int32_t atomic_fetch(int32_t *a) 81ed6f5d66Smrg{ 82ed6f5d66Smrg int32_t v; 83ed6f5d66Smrg barrier(); 84ed6f5d66Smrg v = *a; 85ed6f5d66Smrg barrier(); 86ed6f5d66Smrg return v; 87ed6f5d66Smrg} 88ed6f5d66Smrg 89ed6f5d66Smrgstruct xshmfence { 90ed6f5d66Smrg int32_t v; 91ed6f5d66Smrg}; 92ed6f5d66Smrg 93ed6f5d66Smrg#define xshmfence_init(fd) 94ed6f5d66Smrg 95ed6f5d66Smrg#endif /* _XSHMFENCE_FUTEX_H_ */ 96