diff --git a/src/steam/engine/turnout.hpp b/src/steam/engine/turnout.hpp index 43ac45c57..604e7a98a 100644 --- a/src/steam/engine/turnout.hpp +++ b/src/steam/engine/turnout.hpp @@ -446,7 +446,7 @@ namespace engine { { for (uint i=0; i buffTypes; std::vector providers; + uint resultSlot{0}; + bool isOutput{false}; + struct ServiceCtx { ProviderRef mem; @@ -100,7 +103,7 @@ namespace engine { template SimpleWeavingBuilder - appendBufferTypes(size_t cnt) + appendBufferTypes(uint cnt) { while (cnt--) buffTypes.emplace_back([](BufferProvider& provider) @@ -110,11 +113,20 @@ namespace engine { } SimpleWeavingBuilder - selectOutputSlot(size_t i) + selectResultSlot(uint idx) { - maybeFillDefaultProviders (i+1); - ENSURE (providers.size() > i); - providers[i] = ctx.output; + this->resultSlot = idx; + return move(*this); + } + + SimpleWeavingBuilder + markAsOutputNode() + { + maybeFillDefaultProviders (resultSlot+1); + ENSURE (providers.size() > resultSlot); + providers[resultSlot] = ctx.output; + this->isOutput = true; + return move(*this); } @@ -123,15 +135,16 @@ namespace engine { { maybeFillDefaultProviders (buffTypes.size()); uint i=0; - for (auto& typeCtor : buffTypes) - outTypes.emplace (typeCtor(providers[i])); + for (auto& typeConstructor : buffTypes) + outTypes.emplace ( + typeConstructor (providers[i])); ENSURE (leadPort.size() < N); ENSURE (outTypes.size() < N); using Product = Turnout>; ///////////////////////////////OOO need a way to prepare SeveralBuilder-instances for leadPort and outDescr --> see NodeBuilder - return Product{leadPort.build(), outTypes.build}; + return Product{leadPort.build(), outTypes.build()}; } private: diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 170c2cd9a..ffb81cf96 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -5525,9 +5525,7 @@ - - - +

das ist Handarbeit und erfordert Erfahrung @@ -5548,9 +5546,7 @@ - - - +

notwendig, damit Hinting, Scharfzeichnen und drop-Shaddows funktionieren @@ -5579,9 +5575,7 @@ - - - +

Definition: komplexe Widget-Strukturen, @@ -6546,9 +6540,7 @@ - - - +

dort wird der Kontext aufgegriffen @@ -8260,9 +8252,7 @@ - - - +

...aber im Moment der Lösung brauche ich den Pfad aufwärts. @@ -11003,9 +10993,7 @@ - - - +

rLet(40878 < 18446744073709551615) → S @@ -14303,9 +14291,7 @@ - - - +

könnte man zulassen @@ -51875,9 +51861,7 @@ - - - +

d.h. wir müßten dann auch noch das Interface brechen @@ -51890,9 +51874,7 @@ - - - +

das heißt, für das ganze Thema InteractionControl @@ -51917,9 +51899,7 @@ - - - +

Tangible sollte InteractionState verwenden @@ -51927,9 +51907,7 @@ - - - +

....und demnach sollte InteractionState eben grade nicht von Tangible wissen @@ -51971,9 +51949,7 @@ - - - +

...sonst wird die ganze Sache absurd @@ -52029,9 +52005,7 @@ - - - +

SessionCommandService::trigger @@ -88585,7 +88559,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -88594,6 +88568,18 @@ Date:   Thu Apr 20 18:53:17 2023 +0200

+ + + + + +

+ ...diese ganze Überlegung übersieht, daß auf tieferen Ebenen ja ebenfalls ein Output-Buffer zurückgeliefert werden muß; nur dort unten ist dann kein spezieller BufferProvider notwendig +

+ +
+ +
@@ -88898,40 +88884,69 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + +
    +
  • + Da wird ein spezielle BufferProvider eingeführt, der dann doch gar kein richtiger BufferProvider ist (oder?) +
  • +
  • + und damit der funktionieren kann, muß man ein LocalTag explizit am bestehenden System vorbei schieben +
  • +
+ +
+
+ + + + + + + +

+ zunächst hatte ich diese Idee verworfen, weil sie die einfache Symmetrie der Daten-Feeds durchkreuzt. Nun fällt mir aber auf, daß das ja nur auf dem Top-Level passieren muß, und daß genau da in jedem Fall ein Eingriff notwendig wird, denn man muß die Buffer-Info ja dort injizieren. Daran führt kein Weg vorbei +

+ +
+ +
+
+ + + +
- - - +

...sie entsteht dadurch, daß beide auf bewährten Lösungsmustern aufbauen; das heißt aber noch nicht, daß beide eine gemeinsame Natur haben

- -
+
- - - +

In beiden Fällen gibt es das Problem der Freigabe — aber meine Bewertung ist unterschiedlich ausgefallen: für einen Ausgabe-Vorgang gibt es verschiedene kritische Zustände, und die Möglichkeit einer Verklemmung; und genau weil man den Protokoll-Status über ein Timeout bestimmen kann, besteht auch die Gefahr, daß ein verspäteter Rechenprozeß in Verletzung des Protokolls weiterhin in die Ausgabe schreibt. Ganz anders beim BuffHandle, welches eine möglichst leichtgewichtige low-level-Abstraktion darstellt; die Methoden am dem Handle dienen nur dazu, Protokoll-Schritte auf eine höhere Ebene zurückzumelden, aber der Gebrauch des Handles wird nicht selber durch ein Protokoll geregelt. Hinzu kommt, daß ref-counting einen gewissen Performance-Overhead hat, der für ein BuffHandle vielleicht schon kritisch werden könnte; eine DataSink dagegen wird auf top-Level erstellt und wird dann nach unten nur ausgeliehen

- -
+
- - - +

Das ist das wichtigste Argument: sie finden auf verschiedenen Abstraktionsebenen statt. Der Ausgabevorgang kann möglicherweise  eine Buffer-Verwendung mit einschließen — letztere bekommt aber nur durch den Kontext ihre Bedeutung @@ -88941,10 +88956,21 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + - + + + + + +

+ das Problem ist nämlich: nach innen wird nur noch die TypeID weitergegeben, weil der eigentliche Entry, in dem das LocalTag dann zugänglich wäre, nur in der Metadaten-Tabelle liegt. Im Buffer-Descriptor liegt auch nur die Hash-ID des Typs +

+ +
+
+ @@ -89007,6 +89033,55 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + +

+ auf jeder Ebene gibt es genau eine Slot-ID, von der die Ergebnis-Daten an den Aufrufer zurückgegeben werden. Ohne explizite Konfig ist das der 1.Slot (Konvention). Von dieser Position wird das BuffHandle nicht geschlossen, sondern als Ergebnis geliefert und wandert damit auf die Eingabe-Seite der nächsthöheren Node +

+ +
+
+ + + + +

+ speziell für den top-Level wird ein OutputBufferProvider eingesetzt, der an dieser Stelle dann auch noch ein LocalTag bekommen muß +

+ +
+
+
+ + + + + + +

+ und diese müssen matchen +

+ +
+
+ + + + + +

+ ich empfinde das als einen schrecklichen Hack +

+ +
+ + +
+