rust / expert
Snippet
Konstruieren eines expliziten RawWakers und einer VTable für Low-Level-Executors
Das Erstellen benutzerdefinierter asynchroner Laufzeit-Executors erfordert eine direkte Schnittstelle mit dem Waker-System von Rust über RawWaker und RawWakerVTable. Durch manuelles Verwalten von Referenzzählern auf einer Arc-Heap-Allokation können wir threadsichere Benachrichtigungssignale direkt in Standard-Waker konvertieren, um suspendierte Futures fortzusetzen.
snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use std::sync::Arc;use std::task::{RawWaker, RawWakerVTable, Waker};pub struct Signal;impl Signal {pub fn wake(self: Arc<Self>) {// Implementation of notification logic goes here}}const VTABLE: RawWakerVTable = RawWakerVTable::new(clone_raw,wake_raw,wake_by_ref_raw,drop_raw,);fn clone_raw(data: *const ()) -> RawWaker {unsafe { Arc::increment_strong_count(data as *const Signal); }RawWaker::new(data, &VTABLE)}fn wake_raw(data: *const ()) {let arc = unsafe { Arc::from_raw(data as *const Signal) };arc.wake();}fn wake_by_ref_raw(data: *const ()) {let arc = unsafe { Arc::from_raw(data as *const Signal) };let cloned = arc.clone();let _ = Arc::into_raw(arc);cloned.wake();}fn drop_raw(data: *const ()) {unsafe { Arc::from_raw(data as *const Signal); }}pub fn create_waker(signal: Arc<Signal>) -> Waker {let raw = RawWaker::new(Arc::into_raw(signal) as *const (), &VTABLE);unsafe { Waker::from_raw(raw) }}
Erklärung
1
const VTABLE: RawWakerVTable = RawWakerVTable::new(
Defines die statische Funktionszeigertabelle zur Handhabung von Klonen, Wecken, Wecken durch Referenz und Freigabe des Raw-Pointers.
2
unsafe { Arc::increment_strong_count(data as *const Signal); }
Erhöht manuell den Arc-Referenzzähler unseres Signals, da das Klonen eines rohen Zeigers nicht die standardmäßige Arc-Klon-Logik aufruft.
3
unsafe { Waker::from_raw(raw) }
Erstellt eine sichere, standardmäßige Waker-Instanz aus dem rohen Waker und seiner zugehörigen virtuellen Tabelle.