| #ifndef _LINUX_FUTEX_H |
| #define _LINUX_FUTEX_H |
| |
| /* Second argument to futex syscall */ |
| |
| |
| #define FUTEX_WAIT 0 |
| #define FUTEX_WAKE 1 |
| #define FUTEX_FD 2 |
| #define FUTEX_REQUEUE 3 |
| #define FUTEX_CMP_REQUEUE 4 |
| #define FUTEX_WAKE_OP 5 |
| |
| long do_futex(unsigned long uaddr, int op, int val, |
| unsigned long timeout, unsigned long uaddr2, int val2, |
| int val3); |
| |
| #define FUTEX_OP_SET 0 /* *(int *)UADDR2 = OPARG; */ |
| #define FUTEX_OP_ADD 1 /* *(int *)UADDR2 += OPARG; */ |
| #define FUTEX_OP_OR 2 /* *(int *)UADDR2 |= OPARG; */ |
| #define FUTEX_OP_ANDN 3 /* *(int *)UADDR2 &= ~OPARG; */ |
| #define FUTEX_OP_XOR 4 /* *(int *)UADDR2 ^= OPARG; */ |
| |
| #define FUTEX_OP_OPARG_SHIFT 8 /* Use (1 << OPARG) instead of OPARG. */ |
| |
| #define FUTEX_OP_CMP_EQ 0 /* if (oldval == CMPARG) wake */ |
| #define FUTEX_OP_CMP_NE 1 /* if (oldval != CMPARG) wake */ |
| #define FUTEX_OP_CMP_LT 2 /* if (oldval < CMPARG) wake */ |
| #define FUTEX_OP_CMP_LE 3 /* if (oldval <= CMPARG) wake */ |
| #define FUTEX_OP_CMP_GT 4 /* if (oldval > CMPARG) wake */ |
| #define FUTEX_OP_CMP_GE 5 /* if (oldval >= CMPARG) wake */ |
| |
| /* FUTEX_WAKE_OP will perform atomically |
| int oldval = *(int *)UADDR2; |
| *(int *)UADDR2 = oldval OP OPARG; |
| if (oldval CMP CMPARG) |
| wake UADDR2; */ |
| |
| #define FUTEX_OP(op, oparg, cmp, cmparg) \ |
| (((op & 0xf) << 28) | ((cmp & 0xf) << 24) \ |
| | ((oparg & 0xfff) << 12) | (cmparg & 0xfff)) |
| |
| #endif |