0001
0002
0003
0004
0005
0006
0007
0008 #ifndef _FUTEX_H
0009 #define _FUTEX_H
0010
0011 #include <unistd.h>
0012 #include <sys/syscall.h>
0013 #include <sys/types.h>
0014 #include <linux/futex.h>
0015
0016 struct bench_futex_parameters {
0017 bool silent;
0018 bool fshared;
0019 bool mlockall;
0020 bool multi;
0021 bool pi;
0022 bool broadcast;
0023 unsigned int runtime;
0024 unsigned int nthreads;
0025 unsigned int nfutexes;
0026 unsigned int nwakes;
0027 unsigned int nrequeue;
0028 };
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 static inline int
0049 futex_syscall(volatile u_int32_t *uaddr, int op, u_int32_t val, struct timespec *timeout,
0050 volatile u_int32_t *uaddr2, int val3, int opflags)
0051 {
0052 return syscall(SYS_futex, uaddr, op | opflags, val, timeout, uaddr2, val3);
0053 }
0054
0055 static inline int
0056 futex_syscall_nr_requeue(volatile u_int32_t *uaddr, int op, u_int32_t val, int nr_requeue,
0057 volatile u_int32_t *uaddr2, int val3, int opflags)
0058 {
0059 return syscall(SYS_futex, uaddr, op | opflags, val, nr_requeue, uaddr2, val3);
0060 }
0061
0062
0063
0064
0065
0066 static inline int
0067 futex_wait(u_int32_t *uaddr, u_int32_t val, struct timespec *timeout, int opflags)
0068 {
0069 return futex_syscall(uaddr, FUTEX_WAIT, val, timeout, NULL, 0, opflags);
0070 }
0071
0072
0073
0074
0075
0076 static inline int
0077 futex_wake(u_int32_t *uaddr, int nr_wake, int opflags)
0078 {
0079 return futex_syscall(uaddr, FUTEX_WAKE, nr_wake, NULL, NULL, 0, opflags);
0080 }
0081
0082
0083
0084
0085 static inline int
0086 futex_lock_pi(u_int32_t *uaddr, struct timespec *timeout, int opflags)
0087 {
0088 return futex_syscall(uaddr, FUTEX_LOCK_PI, 0, timeout, NULL, 0, opflags);
0089 }
0090
0091
0092
0093
0094 static inline int
0095 futex_unlock_pi(u_int32_t *uaddr, int opflags)
0096 {
0097 return futex_syscall(uaddr, FUTEX_UNLOCK_PI, 0, NULL, NULL, 0, opflags);
0098 }
0099
0100
0101
0102
0103
0104
0105 static inline int
0106 futex_cmp_requeue(u_int32_t *uaddr, u_int32_t val, u_int32_t *uaddr2, int nr_wake,
0107 int nr_requeue, int opflags)
0108 {
0109 return futex_syscall_nr_requeue(uaddr, FUTEX_CMP_REQUEUE, nr_wake, nr_requeue, uaddr2,
0110 val, opflags);
0111 }
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121 static inline int
0122 futex_wait_requeue_pi(u_int32_t *uaddr, u_int32_t val, u_int32_t *uaddr2,
0123 struct timespec *timeout, int opflags)
0124 {
0125 return futex_syscall(uaddr, FUTEX_WAIT_REQUEUE_PI, val, timeout, uaddr2, 0,
0126 opflags);
0127 }
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138 static inline int
0139 futex_cmp_requeue_pi(u_int32_t *uaddr, u_int32_t val, u_int32_t *uaddr2,
0140 int nr_requeue, int opflags)
0141 {
0142 return futex_syscall_nr_requeue(uaddr, FUTEX_CMP_REQUEUE_PI, 1, nr_requeue, uaddr2,
0143 val, opflags);
0144 }
0145
0146 #endif