Linux x86_64IPC & sincronização#449
futex_waitv
Aguarda em múltiplos futexes simultaneamente, acordando quando qualquer um deles for sinalizado.
Descrição
Resolve um caso que a API `futex` clássica não cobria bem: esperar por qualquer um de vários eventos futex ao mesmo tempo (útil, por exemplo, para runtimes de linguagem implementando `select`-like sobre múltiplas primitivas de sincronização).
man 2Desde o kernel 5.16
Assinatura
int futex_waitv(
struct futex_waitv * waiters,
unsigned int nr_futexes,
unsigned int flags,
struct __kernel_timespec * timeout,
clockid_t clockid
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| waiters | struct futex_waitv * | Array descrevendo cada futex a observar (endereço, valor esperado, flags). |
| nr_futexes | unsigned int | Número de elementos em `waiters`. |
| flags | unsigned int | Reservado; deve ser 0. |
| timeout | struct __kernel_timespec * | Timeout opcional. |
| clockid | clockid_t | Relógio usado para interpretar `timeout`. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | waitersstruct futex_waitv * |
| rsi | argumento 2 | nr_futexesunsigned int |
| rdx | argumento 3 | flagsunsigned int |
| r10 | argumento 4 | timeoutstruct __kernel_timespec * |
| r8 | argumento 5 | clockidclockid_t |
Valor de retorno
Índice do futex que acordou a chamada em sucesso; -1 em erro, com errno definido.
Códigos de erro (errno)
- EAGAIN(11)
- Recurso temporariamente indisponível (tente novamente); também conhecido como EWOULDBLOCK.
- EINVAL(22)
- Argumento inválido.
- ETIMEDOUT(110)
- Conexão expirou (timeout).
- EFAULT(14)
- Endereço de memória inválido (ponteiro fora do espaço de endereçamento válido).