/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _UAPI_LINUX_FUTEX_H
#define _UAPI_LINUX_FUTEX_H
#include <linux/compiler.h>
#include <linux/types.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
#define FUTEX_LOCK_PI 6
#define FUTEX_UNLOCK_PI 7
#define FUTEX_TRYLOCK_PI 8
#define FUTEX_WAIT_BITSET 9
#define FUTEX_WAKE_BITSET 10
#define FUTEX_WAIT_REQUEUE_PI 11
#define FUTEX_CMP_REQUEUE_PI 12
#define FUTEX_LOCK_PI2 13
#define FUTEX_PRIVATE_FLAG 128
#define FUTEX_CLOCK_REALTIME 256
#define FUTEX_CMD_MASK ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME)
#define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG)
#define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG)
#define FUTEX_REQUEUE_PRIVATE (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG)
#define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG)
#define FUTEX_WAKE_OP_PRIVATE (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG)
#define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG)
#define FUTEX_LOCK_PI2_PRIVATE (FUTEX_LOCK_PI2 | FUTEX_PRIVATE_FLAG)
#define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG)
#define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG)
#define FUTEX_WAIT_BITSET_PRIVATE (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG)
#define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG)
#define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | \
FUTEX_PRIVATE_FLAG)
#define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | \
FUTEX_PRIVATE_FLAG)
/*
* Flags for futex2 syscalls .
*
* NOTE : these are not pure flags , they can also be seen as :
*
* union {
* u32 flags ;
* struct {
* u32 size : 2 ,
* numa : 1 ,
* : 4 ,
* private : 1 ;
* } ;
* } ;
*/
#define FUTEX2_SIZE_U8 0 x00
#define FUTEX2_SIZE_U16 0 x01
#define FUTEX2_SIZE_U32 0 x02
#define FUTEX2_SIZE_U64 0 x03
#define FUTEX2_NUMA 0 x04
#define FUTEX2_MPOL 0 x08
/* 0x10 */
/* 0x20 */
/* 0x40 */
#define FUTEX2_PRIVATE FUTEX_PRIVATE_FLAG
#define FUTEX2_SIZE_MASK 0 x03
/* do not use */
#define FUTEX_32 FUTEX2_SIZE_U32 /* historical accident :-( */
/*
* When FUTEX2_NUMA doubles the futex word , the second word is a node value .
* The special value - 1 indicates no - node . This is the same value as
* NUMA_NO_NODE , except that value is not ABI , this is .
*/
#define FUTEX_NO_NODE (-1 )
/*
* Max numbers of elements in a futex_waitv array
*/
#define FUTEX_WAITV_MAX 128
/**
* struct futex_waitv - A waiter for vectorized wait
* @ val : Expected value at uaddr
* @ uaddr : User address to wait on
* @ flags : Flags for this waiter
* @ _ _ reserved : Reserved member to preserve data alignment . Should be 0 .
*/
struct futex_waitv {
__u64 val;
__u64 uaddr;
__u32 flags;
__u32 __reserved;
};
/*
* Support for robust futexes : the kernel cleans up held futexes at
* thread exit time .
*/
/*
* Per - lock list entry - embedded in user - space locks , somewhere close
* to the futex field . ( Note : user - space uses a double - linked list to
* achieve O ( 1 ) list add and remove , but the kernel only needs to know
* about the forward link )
*
* NOTE : this structure is part of the syscall ABI , and must not be
* changed .
*/
struct robust_list {
struct robust_list __user *next;
};
/*
* Per - thread list head :
*
* NOTE : this structure is part of the syscall ABI , and must only be
* changed if the change is first communicated with the glibc folks .
* ( When an incompatible change is done , we ' ll increase the structure
* size , which glibc will detect )
*/
struct robust_list_head {
/*
* The head of the list . Points back to itself if empty :
*/
struct robust_list list;
/*
* This relative offset is set by user - space , it gives the kernel
* the relative position of the futex field to examine . This way
* we keep userspace flexible , to freely shape its data - structure ,
* without hardcoding any particular offset into the kernel :
*/
long futex_offset;
/*
* The death of the thread may race with userspace setting
* up a lock ' s links . So to handle this race , userspace first
* sets this field to the address of the to - be - taken lock ,
* then does the lock acquire , and then adds itself to the
* list , and then clears this field . Hence the kernel will
* always have full knowledge of all locks that the thread
* _ might_ have taken . We check the owner TID in any case ,
* so only truly owned locks will be handled .
*/
struct robust_list __user *list_op_pending;
};
/*
* Are there any waiters for this robust futex :
*/
#define FUTEX_WAITERS 0 x80000000
/*
* The kernel signals via this bit that a thread holding a futex
* has exited without unlocking the futex . The kernel also does
* a FUTEX_WAKE on such futexes , after setting the bit , to wake
* up any possible waiters :
*/
#define FUTEX_OWNER_DIED 0 x40000000
/*
* The rest of the robust - futex field is for the TID :
*/
#define FUTEX_TID_MASK 0 x3fffffff
/*
* This limit protects against a deliberately circular list .
* ( Not worth introducing an rlimit for it )
*/
#define ROBUST_LIST_LIMIT 2048
/*
* bitset with all bits set for the FUTEX_xxx_BITSET OPs to request a
* match of any bit .
*/
#define FUTEX_BITSET_MATCH_ANY 0 xffffffff
#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 & 0 xf) << 28 ) | ((cmp & 0 xf) << 24 ) \
| ((oparg & 0 xfff) << 12 ) | (cmparg & 0 xfff))
#endif /* _UAPI_LINUX_FUTEX_H */
Messung V0.5 in Prozent C=88 H=87 G=87
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland