AUTOSAR_AP_EXP_ARARustApplications
FIG-0c5c943de179f7c7
566 × 443 px
3 Release(s)
Figure 6.12: Slow method invocation
SHA-256 Inhalts-Fingerabdruck:
0c5c943de179f7c776241e3b4eb113566e4434748deca8f9836d8080422a777c
✦
KI-generierte Bildanalyse & technische Beschreibung
Modell: gemini-3.8-flash (via agy) · Rezept figure-description@2 · erstellt am 2026-10-07
1. Diagrammtyp & Architektur-Kontext
- Diagrammtyp: UML-Sequenzdiagramm (Interaktionsdiagramm über Sprachdomänen/FFI-Grenzen hinweg).
- Architektur-Kontext: AUTOSAR Adaptive Platform (ara::com Interoperabilität). Spezifiziert das Zusammenspiel zwischen dem C++-basierten
ara::com-Kommunikationsstack und einer in Rust implementierten Service-Applikation (AUTOSAR_AP_EXP_ARARustApplications). - Funktionaler Zweck: Modellierung des asynchronen „Slow Path“-Aufrufmusters (Slow Method Invocation) einer Service-Methode. Zeigt die Entkopplung und Lebensdauerverwaltung, wenn eine Methodenimplementierung in Rust beim initialen
pollnicht sofort fertiggestellt ist (Poll::Pending), sodass die blockierungsfreie Rückgabe eines C++-ara::core::Futuresowie die Auslagerung in einen Rust-Task-Executor erforderlich werden.
2. Komponenten, Entitäten & Schnittstellen
Domäne Rust:
Executor: Asynchroner Task-Scheduler / Runtime-Executor (z. B. tokio-/smol-ähnliches Modell in der ara-Rust-Umgebung) zur Ausführung geparkter Futures und Verarbeitung von Wake-Events.App: Anwendungslogik, die das vom Skeleton generierte Service-Trait mit asynchronen Methoden (async fnbzw.impl Future) implementiert.Skeleton (gen): Codegenerierte Rust-Abstraktionsschicht, die die FFI-Funktionen typkonform in idiomatische Rust-Interfaces (Async trait call) überführt.ara crate: Statische Laufzeitbibliothek (Runtime-Crate) für Rust, welche die State-Machine für Futures, Waker-Registrierungen (callback_poll), Task-Spawning und FFI-Bindungen zu C++ bereitstellt.
Domäne C++:
Skeleton (gen): Codegenerierter C++-Service-Skeleton (aus ARXML-Interface-Definition), der eingehende Service-Requests aus der Middleware (ara::com-Binding) entgegennimmt.Adapter (gen): Codegenerierte C++/FFI-Brücke, übersetzt C++-Datenstrukturen in C-kompatible FFI-Aufrufe (Implementation call) und instanziiert dasara::core::Promise.Adapter (static): Statische C++-Support-Bibliothek/Laufzeitschicht zur Speicherung und Lebensdauerüberwachung langlebiger C++-Objekte über FFI-Grenzen hinweg.
3. Dynamisches Verhalten & Sequenzablauf
- Request-Eingang & Promise-Erzeugung:
- Ein Service-Request erreicht den C++-
Skeleton (gen). - Der Skeleton ruft
Method invocationam C++-Adapter (gen)auf. Adapter (gen)erzeugt ein lokalesara::core::Promise(Create promise).
- Ein Service-Request erreicht den C++-
- Initialer synchroner Aufrufversuch (FFI-Übergang):
Adapter (gen)übergibt den Methodenaufruf viaImplementation callan das Rust-Skeleton (gen).- Das Rust-Skeleton triggert die Anwendungslogik via
Async trait callaufApp. - Zur Überprüfung der sofortigen Verfügbarkeit leitet das Rust-Skeleton den Kontrollfluss via
callback_pollan dasara crateweiter, welchespollauf der App-Future ausführt.
- Erkennung des Slow Path (
Pending):AppsignalisiertPending(Berechnung/Ressource noch nicht bereit).- Lebensdauer-Transfer: Das
ara crateweist den C++-Adapter (static)an, das Promise auf den Heap zu verschieben (move promise to heap (retain)), um dessen Lebensdauer über den FFI-Aufrufrahmen hinaus zu sichern. - Task-Delegation: Das
ara crateübergibt die Future viaspawn taskan den Rust-Executor. - Der initiale synchrone Stack-Frame kehrt über das Rust-Skeleton zum C++-
Adapter (gen)zurück. Adapter (gen)extrahiert dasara::core::Futureaus dem Promise und gibt es mitreturn futuresynchron an den C++-Skeleton (gen)zurück. Der C++-Thread ist damit sofort wieder unblockiert.
- Asynchrone Ausführung & Re-Polling:
- Der
Executoraktiviert den Task (Task active) imara crate. ara cratepollt dieApperneut (poll).- Da das Ergebnis noch aussteht, registriert die
Appeinen Waker am Executor (subscribe to wake event) und antwortet erneut mitPending.
- Der
- Abschluss & Ergebnis-Propagation:
- Nach Fertigstellung der asynchronen Operation sendet der
ExecutoreinWake eventan dasara crate. ara crateführt das finalepollaus; dieAppantwortet mitReady(result).ara cratesetzt das ausgelagerte C++-Promise (Set promise).- Über das gesetzte Promise wird der Wert an das korrespondierende C++-
Futureim C++-Subsystem signalisiert (gestrichelte Linie zum C++-Skeleton/Client).
- Nach Fertigstellung der asynchronen Operation sendet der
4. Normative Relevanz & Entwickler-Hinweise
- Memory Management & FFI-Lebensdauern:
Entwickler müssen beachten, dass bei Nicht-Fertigstellung im ersten Poll-Zyklus zwingend eine Heap-Allokation (
move promise to heap) auf C++-Seite erfolgt. Für harte Echtzeitanforderungen (ASIL-D / deterministische Latenzen) sollte durch Cache-Warming oder Pre-computation evaluiert werden, ob der „Fast Path“ (Fertigstellung im initialen Poll ohne Heap-Move und ohne Spawn) erzwungen werden kann. - Executor-Dimensionierung:
Da jeder Slow-Call über
spawn taskauf dem Rust-Executor landet, muss der Executor-Threadpool bzw. die Task-Queue ausreichend dimensioniert sein, um Backpressure oder Deadlocks bei vielen parallelen Methodenaufrufen zu verhindern. - Waker-Disziplin (Rust-Konformität):
Die Applikation (
App) muss dem Standard-Rust-Future-Vertrag genügen: Sie darf nur dannPendingzurückgeben, wenn der Waker korrekt am Event-Trigger/Executor registriert wurde (subscribe to wake event), andernfalls droht ein permanentes Hängen des asynchronen Aufrufs. - Fehlerbehandlung:
Fehler (z. B.
ara::core::ErrorCodebzw. Rust-Result::Err) werden analog zuReady(result)überSet promisein das C++-ara::core::Promisepropagiert und materialisieren sich auf C++-Seite als fehlerhafteFuture.
Zugeordnete Anforderungen
Diese Angaben zeigt der Versions-Explorer.