0 Tage Serie
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.