1
2
3
4
5
6
7#ifndef _FUTEX_H
8#define _FUTEX_H
9
10#include <unistd.h>
11#include <sys/syscall.h>
12#include <sys/types.h>
13#include <linux/futex.h>
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#define futex(uaddr, op, val, timeout, uaddr2, val3, opflags) \
36 syscall(SYS_futex, uaddr, op | opflags, val, timeout, uaddr2, val3)
37
38
39
40
41
42static inline int
43futex_wait(u_int32_t *uaddr, u_int32_t val, struct timespec *timeout, int opflags)
44{
45 return futex(uaddr, FUTEX_WAIT, val, timeout, NULL, 0, opflags);
46}
47
48
49
50
51
52static inline int
53futex_wake(u_int32_t *uaddr, int nr_wake, int opflags)
54{
55 return futex(uaddr, FUTEX_WAKE, nr_wake, NULL, NULL, 0, opflags);
56}
57
58
59
60
61static inline int
62futex_lock_pi(u_int32_t *uaddr, struct timespec *timeout, int opflags)
63{
64 return futex(uaddr, FUTEX_LOCK_PI, 0, timeout, NULL, 0, opflags);
65}
66
67
68
69
70static inline int
71futex_unlock_pi(u_int32_t *uaddr, int opflags)
72{
73 return futex(uaddr, FUTEX_UNLOCK_PI, 0, NULL, NULL, 0, opflags);
74}
75
76
77
78
79
80
81static inline int
82futex_cmp_requeue(u_int32_t *uaddr, u_int32_t val, u_int32_t *uaddr2, int nr_wake,
83 int nr_requeue, int opflags)
84{
85 return futex(uaddr, FUTEX_CMP_REQUEUE, nr_wake, nr_requeue, uaddr2,
86 val, opflags);
87}
88
89#ifndef HAVE_PTHREAD_ATTR_SETAFFINITY_NP
90#include <pthread.h>
91static inline int pthread_attr_setaffinity_np(pthread_attr_t *attr,
92 size_t cpusetsize,
93 cpu_set_t *cpuset)
94{
95 attr = attr;
96 cpusetsize = cpusetsize;
97 cpuset = cpuset;
98 return 0;
99}
100#endif
101
102#endif
103