Activity-Lang: consider logic for dependency notification

...turns out there is still a lot of leeway in the possible implementation,
and seemingly it is too early to decide which case to consider the default.
Thus I'll proceed with the drafted preliminary solution...

- on primary-chain, an inhibited Gate dispatches itself into future for re-check
- on Notification, activation happens if and only if this very notification opens the Gate
- provide a specifically wired requireDirectActivation() to allow enforcing a minimal start time
This commit is contained in:
Fischlurch 2023-08-31 20:18:35 +02:00
parent 07fcc89e6a
commit 14effc2349
4 changed files with 349 additions and 23 deletions

View file

@ -116,7 +116,7 @@ namespace gear {
/**
* @return entrance point to this Activity-chain setup
* @return entrance point to this Activity-chain setup.
* @remark use this call for instructing the Scheduler.
*/
Activity&
@ -126,6 +126,60 @@ namespace gear {
return *post_;
}
/**
* Builder operation: block this Term waiting for prerequisite notification.
* @param notificationSrc an `NOTIFY`-Activity to attach the notification-link
* @note using this feature implies to wire in a `GATE`-Activity (if not already
* present) and to increase the Gate's latch counter. Moreover, the Argument,
* _must be a `NOTIFY`_ and will be modified to store the link to this receiving
* Gate; typically this function is actually invoked starting from the other
* Term the prerequisite by invoking `appendNotificationTo(targetTerm)`.
*/
Term&
expectNotification (Activity& notificationSrc)
{
REQUIRE (Activity::NOTIFY == notificationSrc.verb_);
setupGate();
ENSURE (gate_);
ENSURE (Activity::GATE == gate_->verb_);
gate_->data_.condition.incDependencies();
notificationSrc.data_.notification.target = gate_;
return *this;
}
/**
* Builder operation: append a Notification link to the end of this Term's chain.
* @param targetTerm another Term, which thereby becomes dependent on this Term.
* @remark the \q targetTerm will be inhibited, until this Term's chain has
* been activated and processed up to emitting the inserted `NOTIFY`.
*/
Term&
appendNotificationTo (Term& targetTerm)
{
UNIMPLEMENTED ("append NOTIFY and wire this through target.expectNotification()");
return *this;
}
/**
* Insert a self-inhibition to enforce activation is possible only after the
* scheduled start time. Relevant for Jobs, which are to be triggered by external
* events, while the actual computation must not be start prior to activating the
* main chain, even if all prerequisites are already fulfilled.
* @remark typical example is when a target buffer is known to be available only
* after the planned start time and until the planned deadline.
* @note the actual activation always goes through Activity::dispatch() and the
* primary chain is aborted with activity::SKIP. However, since the additional
* notification is inserted at a point executed holding the `GroomingToken`,
* the `dispatch()` actually happens synchronous and immediately processes
* the activated tail-chain in a nested call.
*/
Term&
requireDirectActivation()
{
UNIMPLEMENTED ("wire in self-Notification");
return *this;
}
private:
void
configureTemplate (Template kind)

View file

@ -81,6 +81,7 @@ namespace test {
dispatchChain();
scenario_RenderJob();
scenario_Notification();
scenario_IOJob();
scenario_MetaJob();
}
@ -493,6 +494,55 @@ namespace test {
/** @test TODO usage scenario: Notification from prerequisite Jobs within time window
* - build [similar](\ref #scenario_RenderJob) »CalculationJob« wiring
* - configure extended dependency notification capabilities
* - Case-1 : a Notification decreases the latch, but blocks otherwise
* - Case-2 : when the primary chain is activated after the Notification,
* then the tail chain behind the Gate is dispatched
* @todo WIP 8/23 🔁 define implement
*/
void
scenario_Notification()
{
Time nominal{7,7};
Time start{0,1};
Time dead{0,10};
Time now{555,5};
ActivityDetector detector;
Job testJob{detector.buildMockJob("testJob", nominal, 12345)};
BlockFlowAlloc bFlow;
ActivityLang activityLang{bFlow};
auto term = activityLang.buildCalculationJob (testJob, start,dead);
Activity& anchor = term.post();
// insert instrumentation to trace activation
detector.watchGate (anchor.next, "theGate");
// establish a blocking prerequisite dependency
Activity trigger{Activity::NOTIFY};
// ...in real usage this happens from building the dependency's Term
term.expectNotification (trigger);
// additionally insert inhibition prior to primary-chain activation
term.requireDirectActivation();
CHECK (activity::PASS == ActivityLang::dispatchChain (anchor, now, detector.executionCtx));
CHECK (detector.verifyInvocation("theGate").arg("5.555 ⧐ Act(GATE")
.beforeInvocation("after-theGate").arg("⧐ Act(WORKSTART")
.beforeInvocation("CTX-work").arg("5.555","")
.beforeInvocation("testJob") .arg("7.007",12345)
.beforeInvocation("CTX-done").arg("5.555",""));
cout << detector.showLog()<<endl;
}
/** @test TODO usage scenario: Activity graph for an async Job
* @todo WIP 8/23 🔁 define implement
*/

View file

@ -7041,7 +7041,7 @@ __see also__
&amp;rarr; the protocol [[how to operate the nodes|NodeOperationProtocol]]
</pre>
</div>
<div title="RenderOperationLogic" creator="Ichthyostega" modifier="Ichthyostega" created="202307272322" modified="202308291336" tags="Rendering operational draft" changecount="27">
<div title="RenderOperationLogic" creator="Ichthyostega" modifier="Ichthyostega" created="202307272322" modified="202308311809" tags="Rendering operational draft" changecount="28">
<pre>//The operational logic of Activity execution is the concrete service provided by the [[Scheduler]] to implement interwoven [[render Activities|RenderActivity]] and [[Job execution|RenderJob]].//
* logically, each {{{Activity}}} record represents a //verb// to describe some act performed by »the render process«
* the {{{ActivityLang}}} provides a //builder notation// to build „sentences of activities“ and it sets the framework for //execution// of Activities
@ -7123,9 +7123,9 @@ Since the render engine can be considered performance critical, only a fixed set
:** ⟹ the Activity Language invokes the ''λ-tick''
!!!Post and dispatch
An Activity is //performed// by invoking its {{{activate(now, ctx)}}} function -- however, there is a twist: some Activities require interaction with the Scheduler queue or may even alter this queue -- and such Activities must be performed //in »management mode«// (single threaded, holding the {{{GroomingToken}}}). These requirements can be fulfilled by //dispatching// an Activity through the ''λ-post'', which attempts to acquire the {{{GroomingToken}}} and otherwise sends the action through the //dispatch queue.// Moreover, some follow-up activities need to happen //later// -- and this can be encoded by using a {{{POST}}}-Activity, which both defines a time window of execution and causes its chain-Activity to be sent through ''λ-post''.
An Activity is //performed// by invoking its {{{activate(now, ctx)}}} function -- however, there is a twist: some Activities require interaction with the Scheduler queue or may even alter this queue -- and such Activities must be performed //in »management mode«// (single threaded, holding the {{{GroomingToken}}}). These requirements can be fulfilled by //dispatching// an Activity through the ''λ-post'', which attempts to acquire the {{{GroomingToken}}} to proceed directly -- and otherwise sends the action through the //dispatch queue.// Moreover, some follow-up activities need to happen //later// -- and this can be encoded by using a {{{POST}}}-Activity, which both defines a time window of execution and causes its chain-Activity to be sent through ''λ-post''.
In a similar vein, also ''notifications'' need to happen decoupled from the activity chain from which they originate; thus the Post-mechanism is also used for dispatching notifications. Yet notifications are to be treated specially, since they are directed towards a receiver, which in the standard case is a {{{GATE}}}-Activity and will respond by //decrementing its internal latch.// Consequently, receiving a notification may cause the Gate to become opened; in this case the trigger is passed through a further dispatch through the ''λ-post'' to activate the chain-Activities hooked behind the Gate. The implementation of this state transition logic ensures that this chain behind a Gate can only be //activated once.//
In a similar vein, also ''dependency notifications'' need to happen decoupled from the activity chain from which they originate; thus the Post-mechanism is also used for dispatching notifications. Yet notifications are to be treated specially, since they are directed towards a receiver, which in the standard case is a {{{GATE}}}-Activity and will respond by //decrementing its internal latch.// Consequently, receiving a notification may cause the Gate to become opened; in this case the trigger is passed through a further dispatch through the ''λ-post'' to activate the chain-Activities hooked behind the Gate. Otherwise, if the latch is already zero (or the deadline has passed), nothing happens. Thus the implementation of state transition logic ensures the chain behind a Gate can only be //activated once.//
</pre>
</div>
<div title="RenderProcess" modifier="Ichthyostega" created="200706190705" modified="201112162056" tags="Rendering operational">

View file

@ -76517,6 +76517,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#743f58" DESTINATION="ID_1858134894" ENDARROW="Default" ENDINCLINATION="-547;24;" ID="Arrow_ID_313746889" SOURCE="ID_1276102583" STARTARROW="None" STARTINCLINATION="-1607;-121;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693501342420" ID="ID_1800524836" MODIFIED="1693501398786" TEXT="async-IO mu&#xdf; Memory-Manager blocken">
<arrowlink COLOR="#fe3e84" DESTINATION="ID_623622318" ENDARROW="Default" ENDINCLINATION="-812;50;" ID="Arrow_ID_1026891728" STARTARROW="None" STARTINCLINATION="437;29;"/>
<icon BUILTIN="hourglass"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
@ -77491,10 +77496,24 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1688998714647" ID="ID_1212520042" MODIFIED="1688998724793" TEXT="fr&#xfc;hestmoglich Start-Zeit / Deadline"/>
</node>
<node CREATED="1688998737324" ID="ID_1359190642" MODIFIED="1688998829651" TEXT="GATE">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688998831183" ID="ID_158897194" MODIFIED="1688998848054" TEXT="Inhibitor-Mechanismus mu&#xdf; zu fr&#xfc;he Freigabe verhindern">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688998831183" ID="ID_158897194" MODIFIED="1693502275691" TEXT="Inhibitor-Mechanismus mu&#xdf; zu fr&#xfc;he Freigabe verhindern">
<linktarget COLOR="#5f98b9" DESTINATION="ID_158897194" ENDARROW="Default" ENDINCLINATION="597;427;" ID="Arrow_ID_908519316" SOURCE="ID_706646924" STARTARROW="None" STARTINCLINATION="912;57;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1689169379528" ID="ID_130475381" MODIFIED="1689169406964" TEXT="stellt sich die Frage nach Regel und Ausnahme">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1689169379528" ID="ID_130475381" MODIFIED="1693500400879" TEXT="stellt sich die Frage nach Regel und Ausnahme">
<linktarget COLOR="#ff8c4a" DESTINATION="ID_130475381" ENDARROW="Default" ENDINCLINATION="-1002;56;" ID="Arrow_ID_501288232" SOURCE="ID_1158823061" STARTARROW="None" STARTINCLINATION="1201;66;"/>
<icon BUILTIN="yes"/>
<node CREATED="1693500445141" ID="ID_49874460" MODIFIED="1693500463973" TEXT="Inhibitor ist der Regelfall &#x27f9;">
<node CREATED="1693500501765" ID="ID_1102377205" MODIFIED="1693500532852" TEXT="dann sollte die Notification &#xfc;berhaupt keine Aktivierung (mehr) bewirken"/>
<node CREATED="1693500554621" ID="ID_1265964500" MODIFIED="1693500571590" TEXT="mit dieser &#xc4;nderung w&#xe4;re auch kein Inhibitor mehr notwendig"/>
<node CREATED="1693500572275" ID="ID_428340322" MODIFIED="1693500597467" TEXT="stattdessen re-triggert sich das Gate, bis alle Voraussetzungen gegeben sind"/>
</node>
<node CREATED="1693500491838" ID="ID_857680063" MODIFIED="1693500497833" TEXT="Event-Trigger ist der Regelfall &#x27f9;">
<node CREATED="1693500602346" ID="ID_102624837" MODIFIED="1693500662762" TEXT="dann w&#xfc;rde in der Regel sofort getriggert, sobald die Vorraussetzungen gegeben sind"/>
<node CREATED="1693500663638" ID="ID_85164137" MODIFIED="1693500682336" TEXT="und die Zeitsteuerung der Vorraussetzungen w&#xfc;rde die Koordinierung leisten"/>
<node CREATED="1693500684108" ID="ID_1942907265" MODIFIED="1693500705970" TEXT="somit w&#xe4;re eine zeitgesteuerte Aktivierung &#xfc;berhaupt nicht notwendig"/>
<node CREATED="1693500706577" ID="ID_1660915486" MODIFIED="1693500727098" TEXT="und der Haupt-Chain k&#xf6;nnte &#x201e;frei h&#xe4;ngen&#x201c;"/>
<node CREATED="1693500748179" ID="ID_520416912" MODIFIED="1693500762541" TEXT="die Notification m&#xfc;&#xdf;te dann aber auch zuverl&#xe4;ssig kommen"/>
</node>
</node>
<node CREATED="1689169457943" ID="ID_1317092933" MODIFIED="1689169572378" TEXT="man k&#xf6;nnte ein NOTIFY explizit disponieren">
<richcontent TYPE="NOTE"><html>
@ -77506,6 +77525,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
<node COLOR="#435e98" CREATED="1693500810783" ID="ID_1401320088" MODIFIED="1693500823241" TEXT="diese L&#xf6;sung vorerst umgesetzt">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1693500823905" ID="ID_1958526971" MODIFIED="1693500843764" TEXT="derzeit allerdings nur auf Verdacht">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node COLOR="#5b280f" CREATED="1689169614354" ID="ID_969910286" MODIFIED="1690490579815" TEXT="man k&#xf6;nnte aber auch genau den gleichen Mechanismus direkt in GATE einbauen">
<richcontent TYPE="NOTE"><html>
@ -77730,6 +77755,42 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693495502528" ID="ID_1513616803" MODIFIED="1693495682843" TEXT="Dependency-Notifications herstellen">
<linktarget COLOR="#865257" DESTINATION="ID_1513616803" ENDARROW="Default" ENDINCLINATION="910;65;" ID="Arrow_ID_1729642753" SOURCE="ID_99848990" STARTARROW="None" STARTINCLINATION="987;-87;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1693495715425" HGAP="40" ID="ID_1961334483" MODIFIED="1693495750410" TEXT="in der Planning-Pipeline ist der abh&#xe4;ngige Folge-Job als &#xbb;Parent&#xab; zug&#xe4;nglich" VSHIFT="-7">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1693495768326" HGAP="85" ID="ID_1696760158" MODIFIED="1693495799275" TEXT="daher &#x27f9; vom Ende zum Nachfolger schalten" VSHIFT="-1">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693495830346" ID="ID_1261227945" MODIFIED="1693496221054" TEXT="appendNotificationTo(targetTerm)">
<arrowlink COLOR="#786889" DESTINATION="ID_701999603" ENDARROW="Default" ENDINCLINATION="-1087;-893;" ID="Arrow_ID_893699409" STARTARROW="None" STARTINCLINATION="-687;55;"/>
<arrowlink COLOR="#4b8acc" DESTINATION="ID_1367094984" ENDARROW="Default" ENDINCLINATION="72;7;" ID="Arrow_ID_164230628" STARTARROW="None" STARTINCLINATION="119;9;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693495853623" ID="ID_1367094984" MODIFIED="1693496213723" TEXT="expectNotification(Activity&amp;)">
<linktarget COLOR="#4b8acc" DESTINATION="ID_1367094984" ENDARROW="Default" ENDINCLINATION="72;7;" ID="Arrow_ID_164230628" SOURCE="ID_1261227945" STARTARROW="None" STARTINCLINATION="119;9;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693496733832" ID="ID_704638049" MODIFIED="1693496737576" TEXT="requireDirectActivation()">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1693496745497" ID="ID_1227868232" MODIFIED="1693496759948" TEXT="optionales Zusatz-Feature">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1693496761812" ID="ID_1871769449" MODIFIED="1693497758267" TEXT="stellt eine bindende Startzeit-Schwelle her">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Falls es eine zeitliche Grenze gibt, vor der die Berechnungen grunds&#228;tzlich nicht starten sollen &#8212; beispielsweise weil die Ergebnis-Daten in einen Puffer geschrieben werden, der erst ab einem bestimmten Zeitpunkt verf&#252;gbar ist; dies wird dann <i>indirekt codiert durch den Start-Zeitpunkt</i>&#160;der Haupt-Berechnung, und das Einschleifen einer Notification auf das direkt nachfolgende Gate, was dazu f&#252;hrt, da&#223; eine extern empfangene Notification von abgeschlossenen Vorg&#228;nger-Berechnungen erst <i>nach diesem Zeitpunkt</i>&#160;das Gate &#246;ffnen k&#246;nnen. Diese interne Freischaltungs-Notification wird direkt hinter dem Ankerpunkt (dem POST) eingeh&#228;ngt, verwendet aber ansonsten die vorhandenen Mechanismen (indirekte Aktivierung &#252;ber den Dispatch-hook)
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1688999216020" ID="ID_1652417442" MODIFIED="1689000686850" TEXT="Nutzungs-Zyklus">
<icon BUILTIN="flag-yellow"/>
@ -78080,11 +78141,50 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1690069251010" ID="ID_449595126" MODIFIED="1690069692342" TEXT="bei Erfolg wird die Aktivierung weitergegeben">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_449595126" ENDARROW="Default" ENDINCLINATION="317;20;" ID="Arrow_ID_288430732" SOURCE="ID_1897470873" STARTARROW="None" STARTINCLINATION="233;-20;"/>
</node>
<node CREATED="1692544036224" ID="ID_1531555498" LINK="#ID_846298052" MODIFIED="1692544299830" TEXT="die Deadline selber ist bereits ausgeschlossen"/>
<node CREATED="1692544036224" ID="ID_1531555498" LINK="#ID_846298052" MODIFIED="1693499473498" TEXT="der Deadline-Zeitpunkt selbst sperrt bereits">
<icon BUILTIN="yes"/>
</node>
<node COLOR="#435e98" CREATED="1690069297302" ID="ID_33956976" MODIFIED="1690492032363" TEXT="sonst....">
<icon BUILTIN="help"/>
<node CREATED="1690069315708" ID="ID_1571780277" MODIFIED="1690069346741" TEXT="...soll sich das Gate &#xbb;selbst in die Zukunft schieben&#xab;"/>
<node CREATED="1690069773157" ID="ID_1756992465" MODIFIED="1690069785879" TEXT="Problem: wer bestimmt um wie viel?">
<node CREATED="1690069315708" ID="ID_1571780277" MODIFIED="1690069346741" TEXT="...soll sich das Gate &#xbb;selbst in die Zukunft schieben&#xab;">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1693499693849" ID="ID_1878976712" MODIFIED="1693501299248" TEXT="ist dieses Feature &#xfc;berhaupt notwendig?">
<linktarget COLOR="#9671cb" DESTINATION="ID_1878976712" ENDARROW="Default" ENDINCLINATION="-1051;64;" ID="Arrow_ID_1465904567" SOURCE="ID_1514365592" STARTARROW="None" STARTINCLINATION="624;46;"/>
<icon BUILTIN="help"/>
<node CREATED="1693500036651" ID="ID_891303584" MODIFIED="1693500110260" TEXT="aus generisch-logischen Gr&#xfc;nden eingef&#xfc;hrt">
<icon BUILTIN="info"/>
</node>
<node CREATED="1693500048618" ID="ID_756123423" MODIFIED="1693500318044" TEXT="&#xfc;berfl&#xfc;ssig falls externer Trigger ausschlie&#xdf;lich per Notification kommt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
....denn die Implementierung des Notification-Dispatch erkennt, wenn eine Notification das Gate &#246;ffnet, und dispatched in diesem Fall den Chain sofort zur Ausf&#252;hrung und sperrt dann auch das Gate endg&#252;ltig; das bedeutet: wenn die Aktivierung &#252;ber diesen Mechanismus erfolgt, wird ein geplanter re-Trigger niemals zum Zug kommen (sondern dann stets ein bereits gesperrtes Gate vorfinden
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1693500320700" ID="ID_1158823061" MODIFIED="1693501668230">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
entscheidendes Kriterium: <i>was ist der Regelfall?</i>
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#ff8c4a" DESTINATION="ID_130475381" ENDARROW="Default" ENDINCLINATION="-1002;56;" ID="Arrow_ID_501288232" STARTARROW="None" STARTINCLINATION="1201;66;"/>
<arrowlink COLOR="#ff835a" DESTINATION="ID_1677810131" ENDARROW="Default" ENDINCLINATION="266;-21;" ID="Arrow_ID_1264674848" STARTARROW="None" STARTINCLINATION="-317;19;"/>
<icon BUILTIN="bell"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1690069773157" FOLDED="true" ID="ID_1756992465" MODIFIED="1693501586447" TEXT="Problem: wer bestimmt um wie viel?">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1690069811256" ID="ID_743760450" MODIFIED="1690069828122" TEXT="konstanter Step &#x27f9; spinning"/>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1690491378700" ID="ID_1592003148" MODIFIED="1690491504993">
<richcontent TYPE="NODE"><html>
@ -78125,6 +78225,59 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink DESTINATION="ID_817512371" ENDARROW="Default" ENDINCLINATION="-55;19;" ID="Arrow_ID_1228234954" STARTARROW="None" STARTINCLINATION="-170;11;"/>
</node>
</node>
<node CREATED="1693501591528" ID="ID_332217879" MODIFIED="1693501601917" TEXT="Steuer-Logik">
<node CREATED="1693501607721" ID="ID_182057848" MODIFIED="1693501620284" TEXT="prim&#xe4;r-Chain">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1693501621611" ID="ID_1677810131" MODIFIED="1693501660623" TEXT="gilt als Regelfall">
<linktarget COLOR="#ff835a" DESTINATION="ID_1677810131" ENDARROW="Default" ENDINCLINATION="266;-21;" ID="Arrow_ID_1264674848" SOURCE="ID_1158823061" STARTARROW="None" STARTINCLINATION="-317;19;"/>
<icon BUILTIN="bell"/>
</node>
<node CREATED="1693501675079" ID="ID_1175823594" MODIFIED="1693501687857" TEXT="l&#xe4;uft bei offenem Gate unmittelbar durch"/>
<node CREATED="1693501693061" ID="ID_1925544668" MODIFIED="1693501698656" TEXT="bricht sonst mit SKIP ab"/>
</node>
<node CREATED="1693501703675" ID="ID_1198687710" MODIFIED="1693501710273" TEXT="Notification">
<node CREATED="1693501711283" ID="ID_1997106163" MODIFIED="1693501726005" TEXT="dekrementiert stets das Latch"/>
<node CREATED="1693501726593" ID="ID_1647318573" MODIFIED="1693501760642">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<b>nur</b>&#160;wenn <b>dadruch</b>&#160;das Latch &#10236; 0 geht
</p>
</body>
</html></richcontent>
<node CREATED="1693501762324" ID="ID_31439546" MODIFIED="1693501807025" TEXT="dispatch Chain">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1693501808094" ID="ID_1931167592" MODIFIED="1693501833954" TEXT="GroomingToken &#x27f9; f&#xfc;hrt effektiv sofort zur Ausf&#xfc;hrung(nested)"/>
<node CREATED="1693501834610" ID="ID_823848881" MODIFIED="1693501863067" TEXT="sonst &#x27f9; Dispatch-Queue und als n&#xe4;chste freie Aktion ausgef&#xfc;hrt"/>
</node>
<node CREATED="1693501769499" ID="ID_1059675453" MODIFIED="1693501790365" TEXT="Gate endg&#xfc;ltig sperren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
indem die deadline &#8788; Time::MIN
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1693501874533" ID="ID_627786574" MODIFIED="1693501882023" TEXT="sonst &#x27f9; PASS und nichts weiter tun"/>
</node>
<node CREATED="1693501898442" ID="ID_873026982" MODIFIED="1693501906935" TEXT="Doppel-Aktivierungen">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1693501908584" ID="ID_1998121077" MODIFIED="1693501918471" TEXT="durch spezielle Logik ausgeschlossen">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1693501927323" ID="ID_806186642" MODIFIED="1693501950406" TEXT="Asymmetrie">
<node CREATED="1693501951564" ID="ID_565836616" MODIFIED="1693501951564" TEXT="Notification triggert nur, wenn sie selbst das Gate &#xf6;ffnet"/>
<node CREATED="1693501953170" ID="ID_613304999" MODIFIED="1693501967844" TEXT="prim&#xe4;r-Chain marschiert durch, pr&#xfc;ft aber die Deadaline"/>
</node>
</node>
</node>
</node>
<node CREATED="1688998890863" ID="ID_1091142135" MODIFIED="1690736014967" TEXT="WORKSTART">
<node CREATED="1690069365933" ID="ID_480174077" MODIFIED="1690735578970" TEXT="&#x3bb;-work"/>
@ -78303,6 +78456,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#b14f6e" DESTINATION="ID_462121305" ENDARROW="Default" ENDINCLINATION="-76;7;" ID="Arrow_ID_1396143437" STARTARROW="None" STARTINCLINATION="-74;-111;"/>
<arrowlink COLOR="#ff3681" DESTINATION="ID_1642755650" ENDARROW="Default" ENDINCLINATION="-874;84;" ID="Arrow_ID_846448701" STARTARROW="None" STARTINCLINATION="-223;-228;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693496024760" ID="ID_701999603" MODIFIED="1693496147428" TEXT="hierarchische Notification-Beziehungen herstellen">
<linktarget COLOR="#786889" DESTINATION="ID_701999603" ENDARROW="Default" ENDINCLINATION="-1087;-893;" ID="Arrow_ID_893699409" SOURCE="ID_1261227945" STARTARROW="None" STARTINCLINATION="-687;55;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
@ -79452,6 +79609,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1688258212089" ID="ID_288966469" MODIFIED="1688258228531" TEXT="sonst keine portable L&#xf6;sung verf&#xfc;gbar"/>
<node CREATED="1688258230375" ID="ID_1659248350" MODIFIED="1688258247491" TEXT="mmap und io_uring sind Linux-only"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693501342420" ID="ID_43618567" MODIFIED="1693502543663" TEXT="Achtung: Wechselwirkung mit Memory-Manager">
<arrowlink COLOR="#fe3e84" DESTINATION="ID_623622318" ENDARROW="Default" ENDINCLINATION="-812;50;" ID="Arrow_ID_466178619" STARTARROW="None" STARTINCLINATION="655;38;"/>
<icon BUILTIN="hourglass"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1684980732965" ID="ID_1914429002" MODIFIED="1684980742528" TEXT="Thema: Timing-Updates">
@ -79509,8 +79671,24 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1689202254231" ID="ID_322073846" MODIFIED="1689294940657" TEXT="Eigenschaften einer neu erstellten Epoche">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689202440952" ID="ID_1233864251" MODIFIED="1689295508928" TEXT="EpochGate-Verhalten">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1689202440952" FOLDED="true" ID="ID_1233864251" MODIFIED="1693502628111" TEXT="EpochGate-Verhalten">
<icon BUILTIN="hourglass"/>
<node CREATED="1693502578373" ID="ID_906293868" MODIFIED="1693502622932" TEXT="bisher nur halb gekl&#xe4;rt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Es ist noch nicht klar, wie die Callbacks von async-IO aufgeschaltet werden
</p>
</body>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693502585994" ID="ID_215852439" MODIFIED="1693502626471" TEXT="daher auch nur minimal abgedeckt">
<icon BUILTIN="hourglass"/>
</node>
</node>
<node COLOR="#338800" CREATED="1689202329260" ID="ID_1491199644" MODIFIED="1689294946303" TEXT="Belegen eines Slot">
<icon BUILTIN="button_ok"/>
@ -79930,18 +80108,6 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1693323299522" ID="ID_1282022548" MODIFIED="1693323306513" TEXT="Grundstruktur verdrahten">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693432027554" ID="ID_1114094454" MODIFIED="1693432038626" TEXT="alle Extras zuschalten">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693432039914" ID="ID_99848990" MODIFIED="1693432176338" TEXT="Aufschalten einer Notification">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693432052935" ID="ID_877534705" MODIFIED="1693432176338" TEXT="Einschleifen einer requireDirectActivation()">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693432167704" ID="ID_1355575152" MODIFIED="1693432176339" TEXT="Anh&#xe4;ngen einer Folge-Notification">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node COLOR="#338800" CREATED="1693431821078" ID="ID_783748219" MODIFIED="1693440678716" TEXT="sinnvolle Instrumentierung (um Ausf&#xfc;hrungssequenz zeigen zu k&#xf6;nnen)">
<icon BUILTIN="button_ok"/>
</node>
@ -79969,11 +80135,40 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-pink"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693502167005" ID="ID_13120904" MODIFIED="1693502705671" TEXT="scenario_Notification">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693502193641" ID="ID_970318761" MODIFIED="1693502203897" TEXT="Grundstruktur wie scenario_RenderJob">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693432027554" ID="ID_1114094454" MODIFIED="1693432038626" TEXT="alle Extras zuschalten">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693432039914" ID="ID_99848990" MODIFIED="1693495682842" TEXT="Aufschalten einer Notification">
<arrowlink COLOR="#865257" DESTINATION="ID_1513616803" ENDARROW="Default" ENDINCLINATION="910;65;" ID="Arrow_ID_1729642753" STARTARROW="None" STARTINCLINATION="987;-87;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693502035815" ID="ID_706646924" MODIFIED="1693502281955" TEXT="Einschleifen einer requireDirectActivation()">
<arrowlink COLOR="#5f98b9" DESTINATION="ID_158897194" ENDARROW="Default" ENDINCLINATION="597;427;" ID="Arrow_ID_908519316" STARTARROW="None" STARTINCLINATION="912;57;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693502289659" ID="ID_1184407673" MODIFIED="1693502335094" TEXT="zwei Testf&#xe4;lle">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693502296755" ID="ID_917643294" MODIFIED="1693502333791" TEXT="Notification &#x27f9; dekrementiert">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693502312416" ID="ID_1139733627" MODIFIED="1693502333791" TEXT="primary-Chain &#x27f9; dispatch-Chain">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689200553782" ID="ID_1346681233" MODIFIED="1689200586861" TEXT="scenario_IOJob">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693323299522" ID="ID_392906930" MODIFIED="1693323317032" TEXT="Grundstruktur verdrahten">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1693432167704" ID="ID_1355575152" MODIFIED="1693432176339" TEXT="Anh&#xe4;ngen einer Folge-Notification">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689200553782" ID="ID_722630098" MODIFIED="1689200595611" TEXT="scenario_MetaJob">
<icon BUILTIN="flag-yellow"/>
@ -80618,7 +80813,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1688512304121" ID="ID_304428860" MODIFIED="1689268791975" TEXT="die Gates aller Epochen durchpr&#xfc;fen">
<node COLOR="#435e98" CREATED="1688512304121" ID="ID_304428860" MODIFIED="1693501118442" TEXT="die Gates aller Epochen durchpr&#xfc;fen">
<icon BUILTIN="bell"/>
<node CREATED="1688513728333" ID="ID_276339587" MODIFIED="1688513740995" TEXT="Gate sitzt im ersten Slot einer Epoche"/>
<node CREATED="1688513742667" ID="ID_849223562" LINK="#ID_1088341634" MODIFIED="1688513840525" TEXT="Gate dient in diesem Fall nur als komplexe Bedingung"/>
@ -80629,6 +80824,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#2c8d69" DESTINATION="ID_212018049" ENDARROW="Default" ENDINCLINATION="556;74;" ID="Arrow_ID_1693904148" STARTARROW="None" STARTINCLINATION="472;34;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1693499693849" ID="ID_1766311350" MODIFIED="1693501314685" TEXT="sinnvolle Integration mit async-IO?">
<linktarget COLOR="#9671cb" DESTINATION="ID_1766311350" ENDARROW="Default" ENDINCLINATION="-1051;64;" ID="Arrow_ID_972754095" SOURCE="ID_131095214" STARTARROW="None" STARTINCLINATION="469;21;"/>
<icon BUILTIN="help"/>
<node CREATED="1693501200871" ID="ID_740126575" MODIFIED="1693501219657" TEXT="Thema: Zuverl&#xe4;ssigkeit der Trigger">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1693501220588" ID="ID_1460182660" MODIFIED="1693501234551" TEXT="Interface zum Aufschalten von Triggern auf betroffene Gates"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693501236493" ID="ID_623622318" MODIFIED="1693502543663" TEXT="dies auch in das Job-Planning mit integrieren">
<linktarget COLOR="#fe3e84" DESTINATION="ID_623622318" ENDARROW="Default" ENDINCLINATION="-812;50;" ID="Arrow_ID_1026891728" SOURCE="ID_1800524836" STARTARROW="None" STARTINCLINATION="437;29;"/>
<linktarget COLOR="#fe3e84" DESTINATION="ID_623622318" ENDARROW="Default" ENDINCLINATION="-812;50;" ID="Arrow_ID_466178619" SOURCE="ID_43618567" STARTARROW="None" STARTINCLINATION="655;38;"/>
<icon BUILTIN="hourglass"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1688513885200" ID="ID_47111804" MODIFIED="1689268918964" TEXT="auf der ersten nicht-obsoleten Epoche stehen bleiben">
<icon BUILTIN="button_ok"/>
@ -82730,6 +82938,20 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693499887783" ID="ID_1870927644" MODIFIED="1693499914940" TEXT="f&#xfc;r sp&#xe4;ter...">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1693499916691" ID="ID_1453759334" MODIFIED="1693499934621" TEXT="zu &#xfc;berpr&#xfc;fen">
<icon BUILTIN="stop"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1693499718350" ID="ID_1514365592" MODIFIED="1693501314685" TEXT="mu&#xdf; sich das Gate selbst re-triggern?">
<arrowlink COLOR="#9671cb" DESTINATION="ID_1878976712" ENDARROW="Default" ENDINCLINATION="-1051;64;" ID="Arrow_ID_1465904567" STARTARROW="None" STARTINCLINATION="624;46;"/>
<icon BUILTIN="help"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1693499718350" ID="ID_131095214" MODIFIED="1693501311725" TEXT="Integration von async-IO, Memory-Manager und Job-Planning">
<arrowlink COLOR="#9671cb" DESTINATION="ID_1766311350" ENDARROW="Default" ENDINCLINATION="-1051;64;" ID="Arrow_ID_972754095" STARTARROW="None" STARTINCLINATION="469;21;"/>
<icon BUILTIN="help"/>
</node>
</node>
</node>
</node>
<node CREATED="1685320663808" ID="ID_503599380" MODIFIED="1685320675723" TEXT="Struktur-Elemente">
<linktarget COLOR="#f9ffd5" DESTINATION="ID_503599380" ENDARROW="Default" ENDINCLINATION="-127;-352;" ID="Arrow_ID_215108045" SOURCE="ID_779629114" STARTARROW="None" STARTINCLINATION="-65;91;"/>