Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef _LINUX_FUTEX_H |
2 | #define _LINUX_FUTEX_H | |
3 | ||
4 | /* Second argument to futex syscall */ | |
5 | ||
6 | ||
4732efbe JJ |
7 | #define FUTEX_WAIT 0 |
8 | #define FUTEX_WAKE 1 | |
9 | #define FUTEX_FD 2 | |
10 | #define FUTEX_REQUEUE 3 | |
11 | #define FUTEX_CMP_REQUEUE 4 | |
12 | #define FUTEX_WAKE_OP 5 | |
1da177e4 LT |
13 | |
14 | long do_futex(unsigned long uaddr, int op, int val, | |
15 | unsigned long timeout, unsigned long uaddr2, int val2, | |
16 | int val3); | |
17 | ||
4732efbe JJ |
18 | #define FUTEX_OP_SET 0 /* *(int *)UADDR2 = OPARG; */ |
19 | #define FUTEX_OP_ADD 1 /* *(int *)UADDR2 += OPARG; */ | |
20 | #define FUTEX_OP_OR 2 /* *(int *)UADDR2 |= OPARG; */ | |
21 | #define FUTEX_OP_ANDN 3 /* *(int *)UADDR2 &= ~OPARG; */ | |
22 | #define FUTEX_OP_XOR 4 /* *(int *)UADDR2 ^= OPARG; */ | |
23 | ||
24 | #define FUTEX_OP_OPARG_SHIFT 8 /* Use (1 << OPARG) instead of OPARG. */ | |
25 | ||
26 | #define FUTEX_OP_CMP_EQ 0 /* if (oldval == CMPARG) wake */ | |
27 | #define FUTEX_OP_CMP_NE 1 /* if (oldval != CMPARG) wake */ | |
28 | #define FUTEX_OP_CMP_LT 2 /* if (oldval < CMPARG) wake */ | |
29 | #define FUTEX_OP_CMP_LE 3 /* if (oldval <= CMPARG) wake */ | |
30 | #define FUTEX_OP_CMP_GT 4 /* if (oldval > CMPARG) wake */ | |
31 | #define FUTEX_OP_CMP_GE 5 /* if (oldval >= CMPARG) wake */ | |
32 | ||
33 | /* FUTEX_WAKE_OP will perform atomically | |
34 | int oldval = *(int *)UADDR2; | |
35 | *(int *)UADDR2 = oldval OP OPARG; | |
36 | if (oldval CMP CMPARG) | |
37 | wake UADDR2; */ | |
38 | ||
39 | #define FUTEX_OP(op, oparg, cmp, cmparg) \ | |
40 | (((op & 0xf) << 28) | ((cmp & 0xf) << 24) \ | |
41 | | ((oparg & 0xfff) << 12) | (cmparg & 0xfff)) | |
42 | ||
1da177e4 | 43 | #endif |