Dr Andrew Scott G7VAV

My photo
 
April 2024
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12


futex.h
001: #ifndef _LINUX_FUTEX_H
002: #define _LINUX_FUTEX_H
003: 
004: 
005: #include <linux/types.h>
006: 
007: /* Second argument to futex syscall */
008: 
009: 
010: #define FUTEX_WAIT              0
011: #define FUTEX_WAKE              1
012: #define FUTEX_FD                2
013: #define FUTEX_REQUEUE           3
014: #define FUTEX_CMP_REQUEUE       4
015: #define FUTEX_WAKE_OP           5
016: #define FUTEX_LOCK_PI           6
017: #define FUTEX_UNLOCK_PI         7
018: #define FUTEX_TRYLOCK_PI        8
019: #define FUTEX_WAIT_BITSET       9
020: #define FUTEX_WAKE_BITSET       10
021: #define FUTEX_WAIT_REQUEUE_PI   11
022: #define FUTEX_CMP_REQUEUE_PI    12
023: 
024: #define FUTEX_PRIVATE_FLAG      128
025: #define FUTEX_CLOCK_REALTIME    256
026: #define FUTEX_CMD_MASK          ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME)
027: 
028: #define FUTEX_WAIT_PRIVATE      (FUTEX_WAIT | FUTEX_PRIVATE_FLAG)
029: #define FUTEX_WAKE_PRIVATE      (FUTEX_WAKE | FUTEX_PRIVATE_FLAG)
030: #define FUTEX_REQUEUE_PRIVATE   (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG)
031: #define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG)
032: #define FUTEX_WAKE_OP_PRIVATE   (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG)
033: #define FUTEX_LOCK_PI_PRIVATE   (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG)
034: #define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG)
035: #define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG)
036: #define FUTEX_WAIT_BITSET_PRIVATE       (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG)
037: #define FUTEX_WAKE_BITSET_PRIVATE       (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG)
038: #define FUTEX_WAIT_REQUEUE_PI_PRIVATE   (FUTEX_WAIT_REQUEUE_PI | \
039:                                          FUTEX_PRIVATE_FLAG)
040: #define FUTEX_CMP_REQUEUE_PI_PRIVATE    (FUTEX_CMP_REQUEUE_PI | \
041:                                          FUTEX_PRIVATE_FLAG)
042: 
043: /*
044:  * Support for robust futexes: the kernel cleans up held futexes at
045:  * thread exit time.
046:  */
047: 
048: /*
049:  * Per-lock list entry - embedded in user-space locks, somewhere close
050:  * to the futex field. (Note: user-space uses a double-linked list to
051:  * achieve O(1) list add and remove, but the kernel only needs to know
052:  * about the forward link)
053:  *
054:  * NOTE: this structure is part of the syscall ABI, and must not be
055:  * changed.
056:  */
057: struct robust_list {
058:         struct robust_list *next;
059: };
060: 
061: /*
062:  * Per-thread list head:
063:  *
064:  * NOTE: this structure is part of the syscall ABI, and must only be
065:  * changed if the change is first communicated with the glibc folks.
066:  * (When an incompatible change is done, we'll increase the structure
067:  *  size, which glibc will detect)
068:  */
069: struct robust_list_head {
070:         /*
071:          * The head of the list. Points back to itself if empty:
072:          */
073:         struct robust_list list;
074: 
075:         /*
076:          * This relative offset is set by user-space, it gives the kernel
077:          * the relative position of the futex field to examine. This way
078:          * we keep userspace flexible, to freely shape its data-structure,
079:          * without hardcoding any particular offset into the kernel:
080:          */
081:         long futex_offset;
082: 
083:         /*
084:          * The death of the thread may race with userspace setting
085:          * up a lock's links. So to handle this race, userspace first
086:          * sets this field to the address of the to-be-taken lock,
087:          * then does the lock acquire, and then adds itself to the
088:          * list, and then clears this field. Hence the kernel will
089:          * always have full knowledge of all locks that the thread
090:          * _might_ have taken. We check the owner TID in any case,
091:          * so only truly owned locks will be handled.
092:          */
093:         struct robust_list *list_op_pending;
094: };
095: 
096: /*
097:  * Are there any waiters for this robust futex:
098:  */
099: #define FUTEX_WAITERS           0x80000000
100: 
101: /*
102:  * The kernel signals via this bit that a thread holding a futex
103:  * has exited without unlocking the futex. The kernel also does
104:  * a FUTEX_WAKE on such futexes, after setting the bit, to wake
105:  * up any possible waiters:
106:  */
107: #define FUTEX_OWNER_DIED        0x40000000
108: 
109: /*
110:  * The rest of the robust-futex field is for the TID:
111:  */
112: #define FUTEX_TID_MASK          0x3fffffff
113: 
114: /*
115:  * This limit protects against a deliberately circular list.
116:  * (Not worth introducing an rlimit for it)
117:  */
118: #define ROBUST_LIST_LIMIT       2048
119: 
120: /*
121:  * bitset with all bits set for the FUTEX_xxx_BITSET OPs to request a
122:  * match of any bit.
123:  */
124: #define FUTEX_BITSET_MATCH_ANY  0xffffffff
125: 
126: 
127: #define FUTEX_OP_SET            0       /* *(int *)UADDR2 = OPARG; */
128: #define FUTEX_OP_ADD            1       /* *(int *)UADDR2 += OPARG; */
129: #define FUTEX_OP_OR             2       /* *(int *)UADDR2 |= OPARG; */
130: #define FUTEX_OP_ANDN           3       /* *(int *)UADDR2 &= ~OPARG; */
131: #define FUTEX_OP_XOR            4       /* *(int *)UADDR2 ^= OPARG; */
132: 
133: #define FUTEX_OP_OPARG_SHIFT    8       /* Use (1 << OPARG) instead of OPARG.  */
134: 
135: #define FUTEX_OP_CMP_EQ         0       /* if (oldval == CMPARG) wake */
136: #define FUTEX_OP_CMP_NE         1       /* if (oldval != CMPARG) wake */
137: #define FUTEX_OP_CMP_LT         2       /* if (oldval < CMPARG) wake */
138: #define FUTEX_OP_CMP_LE         3       /* if (oldval <= CMPARG) wake */
139: #define FUTEX_OP_CMP_GT         4       /* if (oldval > CMPARG) wake */
140: #define FUTEX_OP_CMP_GE         5       /* if (oldval >= CMPARG) wake */
141: 
142: /* FUTEX_WAKE_OP will perform atomically
143:    int oldval = *(int *)UADDR2;
144:    *(int *)UADDR2 = oldval OP OPARG;
145:    if (oldval CMP CMPARG)
146:      wake UADDR2;  */
147: 
148: #define FUTEX_OP(op, oparg, cmp, cmparg) \
149:   (((op & 0xf) << 28) | ((cmp & 0xf) << 24)             \
150:    | ((oparg & 0xfff) << 12) | (cmparg & 0xfff))
151: 
152: #endif
153: 


for client 3.138.174.95
© Andrew Scott 2006 - 2024,
All Rights Reserved
http://www.andrew-scott.uk/
Andrew Scott
http://www.andrew-scott.co.uk/