xshmfence_futex.h revision ed6f5d66
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> 33ed6f5d66Smrg 34ed6f5d66Smrgstatic inline int sys_futex(void *addr, int op, int32_t val) 35ed6f5d66Smrg{ 36ed6f5d66Smrg return _umtx_op(addr, op, (uint32_t)val, NULL, NULL) == -1 ? errno : 0; 37ed6f5d66Smrg} 38ed6f5d66Smrg 39ed6f5d66Smrgstatic inline int futex_wake(int32_t *addr) { 40ed6f5d66Smrg return sys_futex(addr, UMTX_OP_WAKE, INT_MAX); 41ed6f5d66Smrg} 42ed6f5d66Smrg 43ed6f5d66Smrgstatic inline int futex_wait(int32_t *addr, int32_t value) { 44ed6f5d66Smrg return sys_futex(addr, UMTX_OP_WAIT_UINT, value); 45ed6f5d66Smrg} 46ed6f5d66Smrg 47ed6f5d66Smrg#else 48ed6f5d66Smrg 49ed6f5d66Smrg#include <stdint.h> 50ed6f5d66Smrg#include <values.h> 51ed6f5d66Smrg#include <linux/futex.h> 52ed6f5d66Smrg#include <sys/time.h> 53ed6f5d66Smrg#include <sys/syscall.h> 54ed6f5d66Smrg 55ed6f5d66Smrgstatic inline long sys_futex(void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3) 56ed6f5d66Smrg{ 57ed6f5d66Smrg return syscall(SYS_futex, addr1, op, val1, timeout, addr2, val3); 58ed6f5d66Smrg} 59ed6f5d66Smrg 60ed6f5d66Smrgstatic inline int futex_wake(int32_t *addr) { 61ed6f5d66Smrg return sys_futex(addr, FUTEX_WAKE, MAXINT, NULL, NULL, 0); 62ed6f5d66Smrg} 63ed6f5d66Smrg 64ed6f5d66Smrgstatic inline int futex_wait(int32_t *addr, int32_t value) { 65ed6f5d66Smrg return sys_futex(addr, FUTEX_WAIT, value, NULL, NULL, 0); 66ed6f5d66Smrg} 67ed6f5d66Smrg 68ed6f5d66Smrg#endif 69ed6f5d66Smrg 70ed6f5d66Smrg#define barrier() __asm__ __volatile__("": : :"memory") 71ed6f5d66Smrg 72ed6f5d66Smrgstatic inline void atomic_store(int32_t *f, int32_t v) 73ed6f5d66Smrg{ 74ed6f5d66Smrg barrier(); 75ed6f5d66Smrg *f = v; 76ed6f5d66Smrg barrier(); 77ed6f5d66Smrg} 78ed6f5d66Smrg 79ed6f5d66Smrgstatic inline int32_t atomic_fetch(int32_t *a) 80ed6f5d66Smrg{ 81ed6f5d66Smrg int32_t v; 82ed6f5d66Smrg barrier(); 83ed6f5d66Smrg v = *a; 84ed6f5d66Smrg barrier(); 85ed6f5d66Smrg return v; 86ed6f5d66Smrg} 87ed6f5d66Smrg 88ed6f5d66Smrgstruct xshmfence { 89ed6f5d66Smrg int32_t v; 90ed6f5d66Smrg}; 91ed6f5d66Smrg 92ed6f5d66Smrg#define xshmfence_init(fd) 93ed6f5d66Smrg 94ed6f5d66Smrg#endif /* _XSHMFENCE_FUTEX_H_ */ 95