Skip to main content

Module futex

Module futex 

Source
Expand description

Famille futex — blocage/réveil noyau sur un mot 32 bits (futex(2)).

Ajoutée par ADR-048 (descellement unique de la couche 0 : std-free + futex(2), re-sceau couche-0-v1.6) pour fournir la primitive de synchronisation std-free dont dépendent la libc Air (air-thread, couche 1) et le mutex interne de l’état io_uring partagé de la couche 0 (qui remplace ainsi son dernier std::sync::Mutex). Cf. docs/specs/layer-0/family-futex.md.

Doctrine « kernel = bible », alignée sur la famille poll (ADR-044) :

  • futex(2) classique (SYS_futex) sur un AtomicU32 de l’appelant — distinct du futex via io_uring (trop lourd pour un Mutex basique, cf. ADR-048 alternatives écartées).
  • Une fonction typée par opération (ADR-021 §3) : futex_wait et futex_wake. Aucun multiplexeur futex(op, …) exposé ; l’op brut reste un détail interne du wrapper asm.
  • EINTR remonté, jamais de retry (ADR-021 §2) : une attente interrompue par un signal renvoie [Errno::EINTR] tel quel ; la reprise (échéance recalculée) vit en couche 1. Le wrapper ne contient aucune boucle.
  • Portée et compte typés (pas de drapeau brut) : [FutexScope] (privé par défaut) et [FutexWakeCount] (borné à INT_MAX par construction).
  • Pas d’allocation (Principe 4) : le mot est emprunté (&AtomicU32), le timeout est un KernelTimespec de pile (réutilisé de poll). Errno = NonZeroI32.

Functions§

futex_wait
futex(2) FUTEX_WAIT : bloque le thread courant tant que word == expected.
futex_wake
futex(2) FUTEX_WAKE : réveille jusqu’à count waiters bloqués sur word.