Skip to main content

futex_wait

Function futex_wait 

Source
pub fn futex_wait(
    word: &AtomicU32,
    expected: u32,
    timeout: Option<Duration>,
    scope: FutexScope,
) -> Result<(), Errno>
Expand description

futex(2) FUTEX_WAIT : bloque le thread courant tant que word == expected.

L’appelant fournit un mot futex AtomicU32 et la valeur expected qu’il vient d’observer. Le noyau revérifie *word == expected atomiquement avant de s’endormir : si la valeur a déjà changé entre la lecture de l’appelant et l’entrée dans le syscall, l’attente est inutile et renvoie immédiatement [Errno::EAGAIN] (c’est l’élimination de la course « réveil perdu »).

  • timeout = None → attente indéfinie (timespec NULL).
  • timeout = Some(d) → attente bornée relative (FUTEX_WAIT mesure contre CLOCK_MONOTONIC) ; Duration::ZERO = sondage immédiat.
  • scope → [FutexScope::Private] (défaut, intra-processus) ou [FutexScope::Shared] (mémoire partagée). Doit être cohérent avec le futex_wake correspondant.

Retour : Ok(()) quand le thread a été réveillé par un futex_wake (ou un réveil spurious — l’appelant relit toujours *word après retour).

§Errors

  • [Errno::EAGAIN] : *word != expected au moment de l’appel — aucune attente n’a eu lieu (réveil perdu évité).
  • [Errno::EINTR] : un signal a interrompu l’attente — remonté tel quel (ADR-021 §2), aucune reprise automatique en couche 0.
  • [Errno::ETIMEDOUT] : l’échéance timeout a expiré avant tout réveil.
  • [Errno::EFAULT] : pointeur invalide — inatteignable via cette API safe (word est une référence vivante, timeout un local vivant ou NULL).