Invocation: investigate ways to configure the output-info

...still not convinced that this is a good design,
since it seems to subvert the general design to treat one special case.
However, I can't see a good way to address this special case directly
This commit is contained in:
Fischlurch 2024-07-30 23:44:55 +02:00
parent a4ff2081b9
commit 4bda550f68
3 changed files with 152 additions and 64 deletions

View file

@ -446,7 +446,7 @@ namespace engine {
{
for (uint i=0; i<outTypes.size(); ++i)
{
BuffHandle resultData = outTypes[i].lockBuffer();
BuffHandle resultData = outTypes[i].lockBuffer(); //////////////////////////OOO LocalTag for output must be injected here -- just HOW???
feed.outBuff.createAt(i, move(resultData));
}
feed.connect (leadPort.size(),outTypes.size());

View file

@ -81,6 +81,9 @@ namespace engine {
std::vector<TypeMarker> buffTypes;
std::vector<ProviderRef> providers;
uint resultSlot{0};
bool isOutput{false};
struct ServiceCtx
{
ProviderRef mem;
@ -100,7 +103,7 @@ namespace engine {
template<class BU>
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<SimpleDirectInvoke<N,FUN>>;
///////////////////////////////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:

View file

@ -5525,9 +5525,7 @@
</node>
<node CREATED="1665801624247" ID="ID_738176993" MODIFIED="1665801755873" TEXT="Hinting und Scharfzeichnen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
das ist Handarbeit und erfordert Erfahrung
@ -5548,9 +5546,7 @@
</node>
<node CREATED="1665801812606" ID="ID_437217153" MODIFIED="1665801844475" TEXT="1-2 Pixel &#xbb;Luft&#xab; lassen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
notwendig, damit Hinting, Scharfzeichnen und drop-Shaddows funktionieren
@ -5579,9 +5575,7 @@
<node CREATED="1534336320373" ID="ID_708892482" MODIFIED="1557498707218" TEXT="Grundbausteine">
<node CREATED="1537659522174" ID="ID_1583657425" MODIFIED="1679362063142" TEXT="primary widgets">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
<b>Definition</b>: komplexe Widget-Strukturen,
@ -6546,9 +6540,7 @@
<node CREATED="1489460736370" ID="ID_794231700" MODIFIED="1518487921060" TEXT="delegiert wird an einen globalen controller"/>
<node CREATED="1489460756271" ID="ID_392157120" MODIFIED="1518487921060">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<i>dort </i>wird der Kontext aufgegriffen
@ -8260,9 +8252,7 @@
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1509501075699" ID="ID_41890562" MODIFIED="1509501075699">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
...aber im Moment der L&#246;sung brauche ich den Pfad aufw&#228;rts.
@ -11003,9 +10993,7 @@
<node CREATED="1513401162242" ID="ID_147162782" MODIFIED="1513401173005" TEXT="push am Ende"/>
<node CREATED="1513401192358" ID="ID_91552039" MODIFIED="1513401294410" TEXT="Beispiel &quot;FAVSU&quot;">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
rLet(40878 &lt; 18446744073709551615) &#8594; S
@ -14303,9 +14291,7 @@
</node>
<node CREATED="1518212683340" ID="ID_1968312736" MODIFIED="1518487921070">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<i>k&#246;nnte</i>&#160;man zulassen
@ -51875,9 +51861,7 @@
<node CREATED="1491692996639" ID="ID_1249742943" MODIFIED="1491693005081" TEXT="double-dispatch"/>
<node CREATED="1491693382706" ID="ID_1886288474" MODIFIED="1576282357987" TEXT="CommandHandler hat keinen R&#xfc;ckgabewert">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
d.h. wir m&#252;&#223;ten dann auch noch das Interface brechen
@ -51890,9 +51874,7 @@
</node>
<node CREATED="1491693197435" ID="ID_1151359036" MODIFIED="1576282357987" TEXT="InteractionState ist kein Tangible">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
das hei&#223;t, f&#252;r das ganze Thema InteractionControl
@ -51917,9 +51899,7 @@
</node>
<node CREATED="1491693246284" ID="ID_553376017" MODIFIED="1576282357986">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Tangible sollte InteractionState <i>verwenden</i>
@ -51927,9 +51907,7 @@
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
....und demnach sollte InteractionState eben grade nicht von Tangible wissen
@ -51971,9 +51949,7 @@
<node CREATED="1492293430689" ID="ID_1472205001" MODIFIED="1492293430689" TEXT="weitgehender Verzicht auf Konsistenzpr&#xfc;fungen"/>
<node CREATED="1492293588400" ID="ID_1878334690" MODIFIED="1576282357985" TEXT="Binden und Dispatch m&#xfc;ssen kombiniert werden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...sonst wird die ganze Sache absurd
@ -52029,9 +52005,7 @@
<node CREATED="1492294356319" ID="ID_1877638479" MODIFIED="1492294363265" TEXT="Semantik-&#xc4;nderung">
<node CREATED="1492294454001" ID="ID_356186975" MODIFIED="1492359481843">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
SessionCommandService::<b>trigger</b>
@ -88585,7 +88559,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<linktarget COLOR="#4395d3" DESTINATION="ID_1329080039" ENDARROW="Default" ENDINCLINATION="-105;0;" ID="Arrow_ID_1999279188" SOURCE="ID_1451110951" STARTARROW="None" STARTINCLINATION="6;-21;"/>
</node>
<node CREATED="1721867643305" ID="ID_327945127" MODIFIED="1721947494363" TEXT="aus dem Schema ausbrechen und diesen Buffer dirrekt durchgeben">
<node CREATED="1721867643305" ID="ID_327945127" MODIFIED="1722393290013" TEXT="aus dem Schema ausbrechen und diesen Buffer dirrekt durchgeben">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -88594,6 +88568,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<linktarget COLOR="#ff2d7f" DESTINATION="ID_327945127" ENDARROW="Default" ENDINCLINATION="3056;127;" ID="Arrow_ID_824161116" SOURCE="ID_403641521" STARTARROW="None" STARTINCLINATION="309;-17;"/>
<node COLOR="#5b280f" CREATED="1722393266885" HGAP="48" ID="ID_678418949" MODIFIED="1722393350799" TEXT="Vorsicht: die Struktur ist rekursiv">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...diese ganze &#220;berlegung &#252;bersieht, da&#223; auf tieferen Ebenen ja ebenfalls ein Output-Buffer zur&#252;ckgeliefert werden mu&#223;; nur dort unten ist dann kein spezieller BufferProvider notwendig
</p>
</body>
</html></richcontent>
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node CREATED="1721866938881" ID="ID_1696632082" MODIFIED="1721946997871" TEXT="die Annahme machen, da&#xdf; es in jedem Callstack nur einen solchen Request gibt">
<richcontent TYPE="NOTE"><html>
@ -88898,40 +88884,69 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink DESTINATION="ID_743923267" ENDARROW="Default" ENDINCLINATION="9;90;" ID="Arrow_ID_674912377" STARTARROW="None" STARTINCLINATION="189;8;"/>
<arrowlink COLOR="#8e30c2" DESTINATION="ID_128884200" ENDARROW="Default" ENDINCLINATION="53;-3;" ID="Arrow_ID_182326182" STARTARROW="None" STARTINCLINATION="-9;58;"/>
<icon BUILTIN="forward"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1722392552172" HGAP="40" ID="ID_1570989783" MODIFIED="1722392597788" TEXT="es bleiben aber Zweifel" VSHIFT="21">
<arrowlink COLOR="#ff0c4e" DESTINATION="ID_93208083" ENDARROW="Default" ENDINCLINATION="2326;0;" ID="Arrow_ID_1577193633" STARTARROW="Default" STARTINCLINATION="-344;36;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1722392616475" ID="ID_946046395" MODIFIED="1722392747592" TEXT="diese ganze L&#xf6;sung erscheint mir als unsaubere Manipulation">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
Da wird ein spezielle BufferProvider eingef&#252;hrt, der dann doch gar kein richtiger BufferProvider ist (oder?)
</li>
<li>
und damit der funktionieren kann, mu&#223; man ein LocalTag explizit am bestehenden System vorbei schieben
</li>
</ul>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1722393055292" ID="ID_1420696816" MODIFIED="1722393080929" TEXT="gibt es denn wirklich keinen direkten Zugang f&#xfc;r diesen einen Spezialfall?">
<icon BUILTIN="help"/>
<node CREATED="1722393091606" ID="ID_1834757825" MODIFIED="1722393104456" TEXT="ich wei&#xdf; da&#xdf; es der top-Level-Aufruf ist"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1722393128569" ID="ID_403641521" MODIFIED="1722393479947" TEXT="und wenn man nun doch den Buffer hier direkt injiziert?">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
zun&#228;chst hatte ich diese Idee verworfen, weil sie die <i>einfache Symmetrie der Daten-Feeds durchkreuzt.</i>&#160;Nun f&#228;llt mir aber auf, da&#223; das ja nur auf dem Top-Level passieren mu&#223;, und da&#223; genau da in jedem Fall ein Eingriff notwendig wird, denn man mu&#223; die Buffer-Info ja dort injizieren. Daran f&#252;hrt kein Weg vorbei
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#ff2d7f" DESTINATION="ID_327945127" ENDARROW="Default" ENDINCLINATION="3056;127;" ID="Arrow_ID_824161116" STARTARROW="None" STARTINCLINATION="309;-17;"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1722393034722" ID="ID_1964241515" MODIFIED="1722393053508" TEXT="Eine Nacht dar&#xfc;ber schlafen!">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node COLOR="#5b280f" CREATED="1722379006311" ID="ID_665293589" MODIFIED="1722380080995" TEXT="M&#xf6;glichkeit-4 ist oberfl&#xe4;chlich clever &#x2014; aber inhaltlich inkonsequent">
<icon BUILTIN="button_cancel"/>
<node CREATED="1722379064983" ID="ID_360363502" MODIFIED="1722379260985" TEXT="die &#xc4;hnlichkeit zwischen BuffHandle und DataSink ist nur oberfl&#xe4;chlich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...sie entsteht dadurch, da&#223; beide auf bew&#228;hrten L&#246;sungsmustern aufbauen; das hei&#223;t aber noch nicht, da&#223; beide eine gemeinsame Natur haben
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1722379089220" ID="ID_673929506" MODIFIED="1722379877456" TEXT="DataSink ist bewu&#xdf;t mit ref-counting, BuffHandle ist in der Verwendung offen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
In beiden F&#228;llen gibt es das Problem der Freigabe &#8212; aber meine Bewertung ist unterschiedlich ausgefallen: f&#252;r einen Ausgabe-Vorgang gibt es verschiedene kritische Zust&#228;nde, und die M&#246;glichkeit einer Verklemmung; und <i>genau weil man den Protokoll-Status &#252;ber ein Timeout bestimmen kann,</i>&#160;besteht auch die Gefahr, da&#223; ein versp&#228;teter Rechenproze&#223; in Verletzung des Protokolls weiterhin in die Ausgabe schreibt. Ganz anders beim BuffHandle, welches eine m&#246;glichst leichtgewichtige low-level-Abstraktion darstellt; die Methoden am dem Handle dienen nur dazu, Protokoll-Schritte auf eine h&#246;here Ebene zur&#252;ckzumelden, aber der Gebrauch des Handles wird nicht selber durch ein Protokoll geregelt. Hinzu kommt, da&#223; ref-counting einen gewissen Performance-Overhead hat, der f&#252;r ein BuffHandle vielleicht schon kritisch werden k&#246;nnte; eine DataSink dagegen wird auf top-Level erstellt und wird dann nach unten nur ausgeliehen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1722379126698" ID="ID_1998092289" MODIFIED="1722380024273" TEXT="Ein Ausgabevorgang und eine Buffer-Verwendung sind zwei verschiedene Dinge">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Das ist das wichtigste Argument: sie finden auf verschiedenen Abstraktionsebenen statt. Der Ausgabevorgang <i>kann m&#246;glicherweise</i>&#160; eine Buffer-Verwendung mit einschlie&#223;en &#8212; letztere bekommt aber nur durch den Kontext ihre Bedeutung
@ -88941,10 +88956,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#5b280f" CREATED="1722384533324" ID="ID_128884200" MODIFIED="1722384881672" TEXT="Ergebnis: kein neues API notwendig">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1722384533324" ID="ID_128884200" MODIFIED="1722392116636" TEXT="API-Erg&#xe4;nzung: LocalTag durchreichen">
<arrowlink COLOR="#8c1444" DESTINATION="ID_450967698" ENDARROW="Default" ENDINCLINATION="-313;-10;" ID="Arrow_ID_414353144" STARTARROW="None" STARTINCLINATION="-367;0;"/>
<linktarget COLOR="#8e30c2" DESTINATION="ID_128884200" ENDARROW="Default" ENDINCLINATION="53;-3;" ID="Arrow_ID_182326182" SOURCE="ID_70781847" STARTARROW="None" STARTINCLINATION="-9;58;"/>
<icon BUILTIN="button_cancel"/>
<icon BUILTIN="flag-pink"/>
<node CREATED="1722392284686" ID="ID_1073120762" MODIFIED="1722392451719" TEXT="mu&#xdf; das wohl doch in den Buffer-Descriptor einbauen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
das Problem ist n&#228;mlich: nach innen wird nur noch die TypeID weitergegeben, weil der eigentliche Entry, in dem das LocalTag dann zug&#228;nglich w&#228;re, nur in der Metadaten-Tabelle liegt. Im Buffer-Descriptor liegt auch nur die Hash-ID des Typs
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1722392313295" ID="ID_854136592" MODIFIED="1722392349478" TEXT="allerdings nur transient &#x2014; damit eine andere Type-ID ankommt"/>
</node>
</node>
</node>
@ -89007,6 +89033,55 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1722385177230" ID="ID_795154055" MODIFIED="1722385231890" TEXT="das LocalTag wird aber nur an einer Stelle (top-Level) gebraucht">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1722385605151" ID="ID_519028808" MODIFIED="1722385612920" TEXT="Markieren des Output-Slot">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1722389530744" ID="ID_1277418704" MODIFIED="1722389536610" TEXT="zu unterscheiden">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1722389538361" ID="ID_35436842" MODIFIED="1722389799354" TEXT="der resultSlot (auf jeder Ebene)">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
auf jeder Ebene gibt es genau eine Slot-ID, von der die Ergebnis-Daten an den Aufrufer zur&#252;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&#228;chsth&#246;heren Node
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1722389548648" ID="ID_81925191" MODIFIED="1722391084422" TEXT="mark Output-Provider">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
speziell f&#252;r den top-Level wird ein OutputBufferProvider eingesetzt, der an dieser Stelle dann auch noch ein LocalTag bekommen mu&#223;
</p>
</body>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1722391086589" ID="ID_1184230118" MODIFIED="1722391099502" TEXT="sch&#xf6;n ist das nicht">
<icon BUILTIN="smily_bad"/>
<node CREATED="1722391101902" ID="ID_304093335" MODIFIED="1722391172338" TEXT="hier m&#xfc;ssen f&#xfc;r eine Sache zwei Konfigs gesetzt werden">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
und diese m&#252;ssen matchen
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1722391173771" ID="ID_720199848" MODIFIED="1722391182384" TEXT="und das alles f&#xfc;r einen einzigen Spezialfall"/>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1722391186291" ID="ID_93208083" MODIFIED="1722392597788">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
ich empfinde das als einen <b>schrecklichen Hack</b>
</p>
</body>
</html></richcontent>
<linktarget COLOR="#ff0c4e" DESTINATION="ID_93208083" ENDARROW="Default" ENDINCLINATION="2326;0;" ID="Arrow_ID_1577193633" SOURCE="ID_1570989783" STARTARROW="Default" STARTINCLINATION="-344;36;"/>
<icon BUILTIN="smiley-angry"/>
</node>
</node>
</node>
</node>
</node>