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 :
RawFd: alias dei32, identique àstd::os::fd::RawFd.OwnedFd: possède le FD, le ferme àDrop(RAII).BorrowedFd<'fd>: emprunte le FD pour la durée'fd, ne ferme rien.- traits
AsRawFd,AsFd,FromRawFd,IntoRawFd.
§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_attrs — indisponible 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 suri32), donc le pontRawFdest 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§
- Borrowed
Fd - 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
RawFdbrut d’une ressource, sans transfert d’ownership. - From
RawFd - Construit une ressource possédant un
RawFd. - Into
RawFd - Consomme une ressource pour en extraire le
RawFdbrut possédé.
Type Aliases§
- RawFd
- Descripteur de fichier brut : l’entier signé manipulé par le kernel.