From 1825f7058ca337e3ae3f7fd7bb98e771838a8a42 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Mon, 31 Mar 2025 17:28:13 +0200 Subject: [PATCH] added last slide --- 09_pinning.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/09_pinning.md b/09_pinning.md index fad4a2f..dfccf38 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. -- GitLab