Voltar à lista
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âmetroTipoDescrição
waitersstruct futex_waitv *Array descrevendo cada futex a observar (endereço, valor esperado, flags).
nr_futexesunsigned intNúmero de elementos em `waiters`.
flagsunsigned intReservado; deve ser 0.
timeoutstruct __kernel_timespec *Timeout opcional.
clockidclockid_tRelógio usado para interpretar `timeout`.

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1waitersstruct futex_waitv *
rsiargumento 2nr_futexesunsigned int
rdxargumento 3flagsunsigned int
r10argumento 4timeoutstruct __kernel_timespec *
r8argumento 5clockidclockid_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).

Relacionadas