diff --git a/09_pinning.md b/09_pinning.md index fad4a2fd9bf0b056b51dc7d5fef669766ab05add..dfccf38d948d1360fa1680fdcd50f2cb1e1ca00e 100644 --- a/09_pinning.md +++ b/09_pinning.md @@ -466,3 +466,23 @@ fn main() { * La macro `pin!()` nous sauve * Si on essaie de refaire l'exemple précent, on a une erreur de compilation * Si on veut absolument faire un `Pin` sur la pile, utiliser `pin!()` + +## La `Coroutine` et le pinning + +* Une souffrance infinie, mais en gros: + 1. Modofier `poll()` en `poll(self: Pin<&mut self>)` + 2. Ajouter `Pin<>` autour de Task + 3. Ajouter un champs `_pin: PhantomPinned` à `Coroutine` +* Régler les problèmes du compilateur: + 1. Des `as_mut()` sur les `match` des future + 2. Ajouter un `this = unsafe { self.get_uncheked_mut() }` dans le `poll()` de `HttpGetFuture` +* Voilà + + +## En résumé + +* On a environ tout pour les `Future` en Rust +* On a ajouté un moyen d'avoir un état interne à notre implémentation `async/await` +* On a ajouté un moyen d'enregistrer/charger des structures qui contiennent des références +* On a vu le concept de `Pin` qui est fondamental pour garantir le modèle mémoire de Rust +* Bref: actuellement on a un runtime primitif qui peut "tout" faire.