1 #ifndef _LINUX_FUTEX_H 2 #define _LINUX_FUTEX_H 3 4 /* Second argument to futex syscall */ 5 6 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 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 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 43 #endif 44