IO_URING kann errno nicht sinnvoll direkt verwenden (errno ist eine globale variable)
- - +void onTick()
{
@@ -1434,8 +1441,7 @@
-
-
+
...es war nicht so, daß Claude diese „Idee gehabt“ hätte — denn ich hatte die Konversation ja so geführt, daß Claude mir meine Konzept-Ansätze validiert und verfeinert. Dann habe ich das Prinzip formuliert, daß für Async-IO irgendwo eine State-Machine sein muß. Claude hat das aufgegriffen, validiert und verschärft; und damit war offensichtlich geworden, daß man diese State-Flag als Atomic auslegen kann. Das habe ich in dem Moment genauso »offensichtlich« gesehen, und Claude hat es ebenso formuliert. @@ -1997,8 +2005,7 @@ ⟹ das wirft ein Licht darauf, wie dieses scheinbar intelligente »Generieren« funktioniert, auf Basis einer industriellen Daten-Technik, die Plausibilitäten integriert und interpoliert.
- - +hier muß auch die Backpressure beachtet und realisiert werden
- - +Sofern er aus dem GUI-Thread alloziert wird, also bevor der Proactor-Thread startet, ist die Position für beide Threads sichtbar (und unveränderlich)
- - +Diese wäre dann ebenfalls teil der cross-Trade-Synchronisation (ebenfalls bewirkt durch release-Semantik auf dem State-Atomic)
- - +...nur als lokale Variable, die er jeweils hochzählt, wenn er einen Trigger bekommt (Nachteil: duplizierter State, dessen Konsistenz sich nur implizit ergibt und nicht offensichtlich ist)
- - +Das wäre dann ein Pointer (const void *); seine Sichtbarkeit ergibt sich auch hier aus dem atomic-State
- - +...da ich immer in Zuständigkeiten denke, ist es mir unsympatisch, einen Satz gemeinsamer Zustands-Variablen zu verwenden
- - +...das gilt für ein Prod-System, in dem der Speicher framentiert ist, und man vermutlich Buffer-Pools hat
- - +Für die Demo ist das die offensichtliche Lösung: man bekommt unique-ownership und Subscript-Operator einfach vom std::unique_ptr. Wenn man den notwendigen Speicher nicht bekommt, dann läuft die Demo eh nicht, also wozu die Umstände?
- - +heißt: hier gibt es keine Möglichkeit, ein Auge zuzudrücken
- - +Eine Operation zum Zugriff und eine Operation um den abgeschlossenen Zugriff zu markieren; zudem gibt es auch noch den Dispatcher.
- - +
Mehrere Argumente dafür: man könnte die low-level-Flags setzen (wie O_CLOEXEX, O_NOFOLLOW, oder gar O_DIRECT). Das Öffnen ist atomic, d.h. das File kann nicht mehr gelöscht/verschoben werden beform man das Filehandle hat (was bei einem getrennten STAT und Path-Check durchaus möglich ist)
Begründung
@@ -2261,8 +2234,7 @@
-
-
+
verwende hier den zweiten Cursor: nextShow_
- - +...und zwar via Glib::Dispatcher ⟶ GUI-Thread. @@ -2325,21 +2292,17 @@ Der zugehörige Handler-Code läuft dann bei nächster Gelegenheit in der GUI-Event-Loop, und holt sich per Callback (Interface PixelFeed) die Daten; in diesem Callback muß die Read-Barrier realisiert sein, damit der GUI-Thread alle vor diesem Punkt erfolgten Datenänderungen auch tatsächlich sieht
- - +Beachte: das darf erst hier passieren, weil wir hier den nächst niedersten erwarteten Frame anschauen; da wir immer etwas im Voraus lesen, werden wir auch ein end-of-File schon einige Ticks früher markieren, müssen aber die Schleife noch solange weiterlaufen lassen, bis die letzten erfolgreich gelesenen Frames in die Anzeige übertragen wurden
- - +brauche doch einen 3.Cursor: currShow_
- - +also brauche ich die cross-Thread-Barriere erst hier
- - +also keine explizite Steuerung
- - +ist jeweils nur möglich wenn der dafür vorgesehene Buffer bereits frei geworden ist
- - +Ist nur möglich wenn diese Daten für den erwartungsgemäß nächsten Frame bereits da sind, und der unmittelbar vorausgegangene Frame schon komplett vom Video-Displayer übernommen wurde
+ ++ im State SHOW pasiert jetzt gar nicht mehr das Display, sondern es bedeutet nun, daß der Frame weitergegeben werden muß +
+ ++ suche einen 4-Buchstaben-Namen, da bin ich Ästhet. PUSH wäre auch denkbar, natürlich wäre PROPAGATE viel korrekter ;-) +
+ +