Skip to main content

Module fd

Module fd 

Source
Expand description

Descripteurs de fichiers propriétaires et empruntés — types FD natifs d’Air.

Ce module définit les types FD de la couche 0 sans dépendre de std::os::fd : il n’utilise que core plus un appel close(2) en assembleur inline pour le Drop. C’est le préalable au passage #![no_std] de la crate (cf. ADR-048 Amendement 1) : core::os::fd n’existe pas sur Rust stable, Air doit donc posséder ses propres types.

§Conception — miroir de std::os::fd

L’API publique est calquée sur std::os::fd (mêmes noms de types, méthodes et traits, mêmes signatures) afin que la migration des sites d’appel soit purement mécanique et que le modèle mental reste celui de la bibliothèque standard :

§Invariant de validité -1 et absence de niche (contrainte stable)

std::os::fd réserve la valeur -1 (sentinelle d’erreur du kernel) comme niche, ce qui donne à Option<OwnedFd> la même taille qu’un OwnedFd. La std obtient cette niche via l’attribut interne rustc_layout_scalar_valid_range_start/end, qui exige la feature nightly rustc_attrsindisponible sur Rust stable (et le passage stable est précisément la raison d’être d’ADR-048).

Cette niche ne peut pas être répliquée sur stable. Une tentative de la simuler en stockant le FD sous forme transformée (!raw dans un NonZeroI32, biais +1, …) introduirait un bug grave : les types FD sont incrustés tels quels dans des structures #[repr(C)] miroir du kernel — au premier chef crate::poll::PollFd, bit-pour-bit struct pollfd dont le champ fd est un BorrowedFd. Le kernel lit alors le motif binaire brut du champ : il doit valoir le FD réel. Toute transformation le corromprait (le kernel polît/ferme un mauvais FD).

Air stocke donc le FD brut dans un i32 (#[repr(transparent)]), exactement comme le motif mémoire de la std :

  • motif binaire == FD réel ⇒ incrustation #[repr(C)] correcte (PollFd…) ;
  • même layout mémoire que std::os::fd::OwnedFd/BorrowedFd (transparent sur i32), donc le pont RawFd est exact ;
  • conséquence : size_of::<Option<OwnedFd>>() == 8 (pas de niche), contre 4 pour la std. C’est le seul écart observable, assumé et scellé comme contrat air-stable jusqu’à ce qu’un mécanisme de niche stable existe (le cas échéant, ré-ouvrir par RFC sans changer le motif binaire).

L’invariant « raw != -1 » reste une précondition documentée des constructeurs unsafe (from_raw_fd/borrow_raw), comme dans la std ; il n’est simplement plus encodé dans la représentation.

Structs§

BorrowedFd
Un descripteur de fichier emprunté, valide pour la durée 'fd.
OwnedFd
Un descripteur de fichier possédé, fermé automatiquement à Drop.

Traits§

AsFd
Emprunte le FD d’une ressource sous forme de BorrowedFd.
AsRawFd
Expose le RawFd brut d’une ressource, sans transfert d’ownership.
FromRawFd
Construit une ressource possédant un RawFd.
IntoRawFd
Consomme une ressource pour en extraire le RawFd brut possédé.

Type Aliases§

RawFd
Descripteur de fichier brut : l’entier signé manipulé par le kernel.