Linux x86_64IPC & sincronização#455
futex_wait
Versão simplificada e mais rápida de futex(FUTEX_WAIT), com uma API dedicada em vez de multiplexada.
Descrição
Contraparte de espera de `futex_wake`, parte da mesma reforma de API.
man 2Desde o kernel 6.7
Assinatura
int futex_wait(
void * uaddr,
unsigned long val,
unsigned long mask,
unsigned int flags,
struct __kernel_timespec * timeout,
clockid_t clockid
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| uaddr | void * | Endereço da palavra futex. |
| val | unsigned long | Valor esperado em *uaddr para que a chamada durma. |
| mask | unsigned long | Máscara de bits usada ao ser acordado seletivamente. |
| flags | unsigned int | Flags de tamanho/privacidade do futex. |
| 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 | uaddrvoid * |
| rsi | argumento 2 | valunsigned long |
| rdx | argumento 3 | maskunsigned long |
| r10 | argumento 4 | flagsunsigned int |
| r8 | argumento 5 | timeoutstruct __kernel_timespec * |
| r9 | argumento 6 | clockidclockid_t |
Valor de retorno
0 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.
- EINTR(4)
- Chamada interrompida por um sinal.
- EINVAL(22)
- Argumento inválido.
- ETIMEDOUT(110)
- Conexão expirou (timeout).