Scheduler: design the core API operation - postDispatch

This central operation sits at a crossroad and is used
- from external clients to fed new work to the Scheduler
- from Workers to engage into execution of the next Activity
- recursively from the execution of an Activity-chain

From these requirements the semantics of behaviour can be derived
regarding the GroomingToken and the result values, which indicate
when follow-up work should be processed
This commit is contained in:
Fischlurch 2023-10-18 15:50:11 +02:00
parent 55967cd649
commit 666546856f
4 changed files with 211 additions and 76 deletions

View file

@ -142,6 +142,7 @@ namespace gear {
}
/** look into the queues and possibly retrieve work due by now */
Activity*
findWork (SchedulerInvocation& layer1, Time now)
{
@ -156,10 +157,31 @@ namespace gear {
}
/***************************************************//**
* This is the primary entrance point to the Scheduler.
* Engage into activity as controlled by given start time.
* Attempts to acquire the GroomingToken if Activity is due
* immediately, otherwise just enqueue it for prioritisation.
* @param chain the Render Activities to put into action
* @param when the indicated time of start for these
* @param executionCtx abstracted execution environment for
* Render Activities (typically backed by the
* Scheduler as a whole, including notifications
* @return Status value to indicate how to proceed processing
* - activity::PASS continue processing in regular operation
* - activity::WAIT nothing to do now, check back later
* - activity::HALT serious problem, cease processing
* @note Attempts to acquire the GroomingToken for immediate
* processing, but not for just enqueuing planned tasks.
* Never drops the GroomingToken explicitly (unless when
* switching from grooming-mode to work-mode in the course
* of processing the given Activity chain regularly).
*/
template<class EXE>
activity::Proc
postDispatch (Activity* chain, EXE& executionCtx)
postDispatch (Activity* chain, Time when
,EXE& executionCtx
,SchedulerInvocation& layer1)
{
UNIMPLEMENTED ("core function: maybe perform activity");
}

View file

@ -64,7 +64,7 @@ namespace test {
verifyFakeInvocation();
verifyMockJobFunctor();
verifyFakeExeContext();
watch_activation();
watch_ActivationProbe();
watch_ActivationTap();
insert_ActivationTap();
watch_notification();
@ -207,7 +207,7 @@ namespace test {
/** @test faked execution context to perform Activity activation
* - wired internally to report each invocation into the EventLog
* - by default response of `post` and `tick` is `PASS`, but can be reconfigured
* - invocation sequence can be verified by the usual scheme
* - invocation sequence can be verified by matching internally logged events
*/
void
verifyFakeExeContext()
@ -252,11 +252,10 @@ namespace test {
/** @test diagnostic setup to detect Activity activation
* @todo WIP 8/23 define implement
/** @test a rigged diagnostic probe to detect Activity activation
*/
void
watch_activation()
watch_ActivationProbe()
{
ActivityDetector detector;
auto someID = "trap-" + randStr(4);
@ -272,7 +271,6 @@ namespace test {
/** @test diagnostic adaptor to detect and pass-through Activity activation
* @todo WIP 8/23 define implement
*/
void
watch_ActivationTap()
@ -314,7 +312,6 @@ namespace test {
/** @test inject (prepend) an ActivationTap into existing wiring
* @todo WIP 8/23 define implement
*/
void
insert_ActivationTap()
@ -343,7 +340,7 @@ namespace test {
/** @test diagnostic setup to detect passing a notification
/** @test diagnostic setup to detect and watch passing a notification
* - setup a chain-Activity (here: a `TICK`) protected by a `GATE`
* - configure the `GATE` to require one notification
* - connect a `NOTIFY`-Activity to trigger the `GATE`
@ -351,8 +348,7 @@ namespace test {
* - dispatch of the notification can be verified
* - notification has been passed through the Tap to the `GATE`
* - `GATE` has been decremented to zero and triggers chain
* - finally the chained `TICK`-Activity calls into the `executionCtx`
* @todo WIP 8/23 define 🔁 implement
* - finally the chained `TICK`-Activity calls into the `executionCtx`
*/
void
watch_notification()
@ -385,7 +381,6 @@ namespace test {
* Activity after the Gate is activated
* - for this unit-test, a Gate and a follow-up Activity
* is invoked directly, to verify the generated log entries
* @todo WIP 7/23 define implement
*/
void
watch_gate()

View file

@ -118,7 +118,7 @@ namespace test {
ActivityDetector detector;
// sched.postDispatch (sched.findWork(queues), detector.executionCtx); ///////////////////////OOO findWork umschreiben
cout << detector.showLog()<<endl; // HINT: use this for investigation...
// cout << detector.showLog()<<endl; // HINT: use this for investigation...
}
@ -329,12 +329,61 @@ namespace test {
/** @test TODO verify entrance point for performing an Activity chain.
* @todo WIP 10/23 🔁 define implement
* @todo WIP 10/23 define 🔁 implement
*/
void
verify_postDispatch()
{
UNIMPLEMENTED ("postDispatch");
// rigged execution environment to detect activations
ActivityDetector detector;
Activity& activity = detector.buildActivationProbe ("testActivity");
SchedulerInvocation queue;
SchedulerCommutator sched;
Time t1{10,0};
Time t2{20,0};
Time t3{30,0};
Time now{t2};
// no one holds the GroomingToken
___ensureGroomingTokenReleased(sched);
auto myself = std::this_thread::get_id();
CHECK (not sched.holdsGroomingToken (myself));
// no effect when no Activity given
CHECK (activity::WAIT == sched.postDispatch (nullptr, now, detector.executionCtx, queue));
CHECK (not sched.holdsGroomingToken (myself));
// Activity immediately dispatched when on time and GroomingToken can be acquired
CHECK (activity::PASS == sched.postDispatch (&activity, t1, detector.executionCtx, queue));
CHECK ( sched.holdsGroomingToken (myself));
CHECK ( queue.empty());
// future Activity is enqueued by short-circuit directly into the PriorityQueue if possible
CHECK (activity::PASS == sched.postDispatch (&activity, t3, detector.executionCtx, queue));
CHECK ( sched.holdsGroomingToken (myself));
CHECK (not queue.empty());
CHECK (isSameObject (activity, *queue.peekHead())); // appears at Head, implying it's in Priority-Queue
queue.pullHead();
sched.dropGroomingToken();
CHECK (not sched.holdsGroomingToken (myself));
CHECK (queue.empty());
// ...but GroomingToken is not acquired explicitly; Activity is just placed into the Instruct-Queue
CHECK (activity::PASS == sched.postDispatch (&activity, t3, detector.executionCtx, queue));
CHECK (not sched.holdsGroomingToken (myself));
CHECK (not queue.peekHead()); // not appearing at Head this time,
CHECK (not queue.empty()); // rather waiting in the Instruct-Queue
blockGroomingToken(sched);
CHECK (activity::PASS == sched.postDispatch (&activity, t2, detector.executionCtx, queue));
CHECK (not sched.holdsGroomingToken (myself));
CHECK (not queue.peekHead()); // was enqueued, not executed
cout << detector.showLog()<<endl; // HINT: use this for investigation...
}

View file

@ -80337,9 +80337,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697500389540" ID="ID_1060348674" MODIFIED="1697501192679">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<i>wenn</i>&#160;es zur Ausf&#252;hrung kommt: when &#8801; now
@ -81632,9 +81630,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697495777693" ID="ID_178664157" MODIFIED="1697495838069" TEXT="mu&#xdf; eine initiale pre-Allokation angeben">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...f&#252;r den internen Memory-Pool. Der kann zwar wachsen (was dann aber ggfs. blockt). Und: der Pool schrumpft nie!
@ -81710,9 +81706,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697503108192" ID="ID_1302864247" MODIFIED="1697503118285" TEXT="das ist ein Freiheitsgrad des POST-Eingangs"/>
<node CREATED="1697503124087" ID="ID_1183635639" MODIFIED="1697503267864" TEXT="ist auch gut so: keine enge Kopplung zwischen Commutator und Activity-Language">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...man k&#246;nnte ja auf die Idee kommen, da&#223; sich der Scheduler diese Zeit aus dem Activity-Record holt; das w&#228;re aber eine extrem schlechte Idee, denn es w&#252;rde die ganze Einteilung in Schichten hintertreiben.
@ -81773,9 +81767,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697475051688" ID="ID_285432698" MODIFIED="1697475071594" TEXT="dann kann der POST einer Activity direkt in die Priority-Queue gehen"/>
<node COLOR="#435e98" CREATED="1697475074049" ID="ID_948956152" MODIFIED="1697483089574">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
wird das hier auf Layer-1 realisiert &#8212;
@ -81788,9 +81780,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="help"/>
<node CREATED="1697483009149" ID="ID_857193449" MODIFIED="1697483086272" TEXT="Konsistenz und Balance spielen eine Rolle">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
single level of abstraction / do only one thing and do it well
@ -81815,9 +81805,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697496266988" ID="ID_1227453518" MODIFIED="1697496280877" TEXT="Name: erscheint mir logisch"/>
<node COLOR="#5b280f" CREATED="1697496282650" ID="ID_1795543272" MODIFIED="1697496411465" TEXT="gef&#xe4;hrlich? &#xd83e;&#xdc32; das ist kein Thema">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...es handelt sich offensichtlich bei Layer-1 um eine low-Level-Einrichtung und um ein internes API, das nicht gegen Mi&#223;brauch gewappnet sein mu&#223;
@ -84910,6 +84898,31 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1687909969073" ID="ID_1256883233" MODIFIED="1687909980556" TEXT="gepr&#xfc;ft beim Zugriff auf den Scheduler"/>
<node CREATED="1687909981295" ID="ID_360021579" MODIFIED="1687909991866" TEXT="Alarm wenn letzter Tick zu lange zur&#xfc;ckliegt"/>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#25244e" CREATED="1697629876020" HGAP="-11" ID="ID_1558265964" MODIFIED="1697630576761" STYLE="bubble" TEXT="wer/wann gibt frei?" VSHIFT="8">
<edge STYLE="linear"/>
<linktarget COLOR="#a6abc1" DESTINATION="ID_1558265964" ENDARROW="Default" ENDINCLINATION="-464;68;" ID="Arrow_ID_574579621" SOURCE="ID_867944115" STARTARROW="None" STARTINCLINATION="-351;0;"/>
<font NAME="SansSerif" SIZE="13"/>
<node CREATED="1697629959705" ID="ID_1297661015" MODIFIED="1697630511624" STYLE="bubble" TEXT="stets ein Proze&#xdf;-Schritt">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
<node CREATED="1697630210695" ID="ID_1631941642" MODIFIED="1697630511624" TEXT="grooming-Mode &#x27f6; work-Mode"/>
<node CREATED="1697630246258" ID="ID_1690734466" MODIFIED="1697630511624" TEXT="Abschlu&#xdf; des Arbeits-Zyklus"/>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1697629959705" ID="ID_1708319964" MODIFIED="1697630186618" STYLE="fork">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
per <b>Seiteneffekt</b>&#160;<i>erlangt</i>
</p>
<p>
per <b>Proze&#223;</b>&#160;<i>freigegeben</i>
</p>
</body>
</html></richcontent>
<font NAME="SansSerif" SIZE="10"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1694005255592" ID="ID_66203071" MODIFIED="1697585717123" TEXT="Fragen/Probleme">
<icon BUILTIN="messagebox_warning"/>
@ -85003,9 +85016,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="broken-line"/>
<node CREATED="1697482590548" ID="ID_751862810" MODIFIED="1697482639262" TEXT="die erste Betrachtungsweise ist wohl inzwischen &#xfc;berholt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...sie ist entstanden aus den ersten Analysen, als die Bedeutung der &#187;Activity-Language&#171; noch nicht gekl&#228;rt war
@ -85027,9 +85038,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697560285403" ID="ID_1068838996" MODIFIED="1697560290998" TEXT="braucht aktuelle Zeit als Argument"/>
<node CREATED="1697560292466" ID="ID_1745021963" MODIFIED="1697560343136" TEXT="liefert einen Activity* (nullable)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
wir sind hier in einer performance-kritischen Zone; insofern kein std::optional&lt;Activity&amp;&gt;
@ -85041,9 +85050,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697594603461" ID="ID_1650388592" MODIFIED="1697594606354" TEXT="nullptr"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697594606701" ID="ID_364246048" MODIFIED="1697594671903" TEXT="GroomingToken nicht l&#xf6;schen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
man k&#246;nnte es hier auch freigeben; das w&#252;rde dann aber im Regelfall ein weiteres mal gepr&#252;ft und freigegeben; zudem haben wir hier auf dieser Ebene auch kein try-catch
@ -85100,6 +85107,68 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697559679293" ID="ID_91432759" MODIFIED="1697594534424" TEXT="auch Layer-2 ist ein Funktionalit&#xe4;ts-Layer"/>
<node CREATED="1697559691347" ID="ID_622772582" MODIFIED="1697594534424" TEXT="der Service wird erst im Scheduler top-Level zusammengestellt"/>
<node CREATED="1697559712744" ID="ID_1900900735" MODIFIED="1697594534424" TEXT="dort passiert auch jedwede Dependency-Injection"/>
<node CREATED="1697629803446" ID="ID_867944115" MODIFIED="1697630595159" TEXT="Seiteneffekt: GroomingToken wird erlangt aber nicht abgegeben">
<arrowlink COLOR="#a6abc1" DESTINATION="ID_1558265964" ENDARROW="Default" ENDINCLINATION="-464;68;" ID="Arrow_ID_574579621" STARTARROW="None" STARTINCLINATION="-351;0;"/>
</node>
<node CREATED="1697634823477" ID="ID_445796279" MODIFIED="1697634986661" TEXT="R&#xfc;ckgabewert: sowohl f&#xfc;r Work-Function alsauch &#x3bb;-post">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Das bedeutet: der R&#252;ckgabewert ist ein Kompromi&#223;, und so gestaltet, da&#223; er in beiden Nutz-Szenarien <i>kein Fehlverhalten verursacht. </i>Er ist damit keine Ausf&#252;hrungs-Steuerung, aber signalisiert Fehlersituationen
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1697628889224" ID="ID_1337049621" MODIFIED="1697630748734" TEXT="&#x27f9; erwartetes Verhalten">
<arrowlink COLOR="#9ca0a6" DESTINATION="ID_1032090324" ENDARROW="Default" ENDINCLINATION="-719;-92;" ID="Arrow_ID_1412557043" STARTARROW="None" STARTINCLINATION="-335;509;"/>
<node CREATED="1697628930257" ID="ID_412159967" MODIFIED="1697628991437" TEXT="Entscheidung &#xfc;ber Dispatch | Enqueue"/>
<node CREATED="1697629037716" ID="ID_661469490" MODIFIED="1697629194450" TEXT="Dispatch &#x2014;&#x27f6; activate Chain"/>
<node CREATED="1697629037716" ID="ID_1804930188" MODIFIED="1697629210016" TEXT="Enqueue &#x2014;&#x27f6;">
<node CREATED="1697629233777" ID="ID_1657805830" MODIFIED="1697629258507" TEXT="grooming &#x27f9; direct Prio"/>
<node CREATED="1697629262781" ID="ID_536475041" MODIFIED="1697629302640" TEXT="external &#x27f9; Instruct-Queue"/>
</node>
<node CREATED="1697629308535" ID="ID_642189936" MODIFIED="1697629789979" TEXT="ben&#xf6;tigt">
<icon BUILTIN="forward"/>
<node CREATED="1697629325069" ID="ID_306618614" MODIFIED="1697629354453" TEXT="Activity(chain)"/>
<node CREATED="1697629355753" ID="ID_82255923" MODIFIED="1697629361708" TEXT="startTime"/>
<node CREATED="1697629370543" ID="ID_1942518217" MODIFIED="1697629785443" TEXT="ExecutionCtx"/>
<node CREATED="1697629776697" ID="ID_1560427872" MODIFIED="1697629782700" TEXT="Layer-1"/>
</node>
<node CREATED="1697632525759" ID="ID_1296592799" MODIFIED="1697632543844" TEXT="Ergebnis-Status">
<icon BUILTIN="back"/>
<node CREATED="1697632548431" ID="ID_971632241" MODIFIED="1697632714619">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font face="Monospaced">activity::</font><font face="Monospaced" color="#603818"><b>PASS</b></font>&#160;&#8801; alles gut &#8230; <i>weitermachen</i>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1697632548431" ID="ID_240131504" MODIFIED="1697633445958">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font face="Monospaced">activity::</font><font color="#603818" face="Monospaced"><b>WAIT</b></font>&#160;&#8801;&#160;&#160;&#8230; <i>aktuell nichts mehr zu tun</i>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1697632548431" ID="ID_62563799" MODIFIED="1697633433426">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font face="Monospaced">activity::</font><font color="#603818" face="Monospaced"><b>HALT</b></font>&#160;&#8801; oh weh &#8230; <i>bitte anhalten</i>
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1697553674095" ID="ID_1453351337" MODIFIED="1697594493393" TEXT="decideDispatchNow">
@ -85139,44 +85208,35 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697579807584" ID="ID_1369153607" MODIFIED="1697579813611" TEXT="brauche zudem die aktuelle Zeit"/>
<node CREATED="1697579814431" ID="ID_184140714" MODIFIED="1697583353917">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
versuche GroomingToken zu erlangen (<b><font color="#5e3348">Seiteneffekt</font></b>)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697583303207" ID="ID_332099803" MODIFIED="1697583538155" TEXT="aber: kein dropGroomingToken() bei negativer Entscheidung">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...weil im normalen Control-flow direkt danach die Activity in die Queue gestellt wird &#8212; und da k&#246;nnen wir eine <i>signifikannte Beschleunigung</i>&#160;erziehlen wenn wir das GroomingToken halten und deshalb nicht durch die Instruct-Queue gehen m&#252;ssen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697583572667" ID="ID_1258733239" MODIFIED="1697583665481" TEXT="Konsequenz: f&#xe4;llige Activities dr&#xe4;ngen sich vor">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und zwar, weil sie infolge der hier getroffenen Entscheidung unmittelbar in den Dispatch gehen k&#246;nnen; w&#228;re das nicht so, dann w&#252;rde u.U aus der Priority-Queue zun&#228;chst eine noch dringendere/fr&#252;here Aufgabe entnommen werden.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
@ -86149,9 +86209,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697484847247" ID="ID_441483633" MODIFIED="1697484871392" TEXT="zusammen mit dem (bereits konstruierten) ActivityLang-Term-Builer"/>
<node COLOR="#435e98" CREATED="1697485132481" ID="ID_1157256654" MODIFIED="1697493645751">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
offen: wie erfolgt hier der <i>&#187;Seed&#171; </i>?
@ -86161,9 +86219,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="help"/>
<node CREATED="1697485169820" ID="ID_372957466" MODIFIED="1697485263308" TEXT="wenigstens eine Activity mu&#xdf; von au&#xdf;en kommen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
typischerweise ist das eine Planungs-Activity, also ein activity::Term::META_JOB
@ -86180,9 +86236,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1697485403636" ID="ID_762107196" MODIFIED="1697493508222" TEXT="&#x27f9; Konsequenz: stets R&#xfc;ckkehr am Ende der Kette"/>
<node CREATED="1697485465076" ID="ID_1682905763" MODIFIED="1697493655398" TEXT="ein Worker w&#xfc;rde dann halt gleich wieder auf der Matte stehen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und w&#252;rde dadurch dann nach dem Meta-Job auch gleich noch den ersten Frame-Job ausf&#252;hren, was aber genau so auch w&#252;nschenswert ist
@ -86192,9 +86246,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697485511390" ID="ID_1983862774" MODIFIED="1697493692458" TEXT="dagegen ein externer Aktor beim Start des Playback macht nur einen Aufruf">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...was <i>schlimmstenfalls</i>&#160;dazu f&#252;hrt, da&#223; er direkt den ersten Planungs-Chunk ausf&#252;hrt
@ -86245,9 +86297,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697570844041" ID="ID_744923834" MODIFIED="1697570856555" TEXT="100 Wiederholungen in 20 Threads"/>
<node CREATED="1697570748133" ID="ID_1723527988" MODIFIED="1697571093396" TEXT="Ergebnisse sind sehr deutlich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -86258,8 +86308,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</li>
</ul>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="list"/>
</node>
</node>
@ -86295,9 +86344,29 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697560546952" ID="ID_1326942653" MODIFIED="1697560620824" TEXT="verify_postDispatch">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1697560546952" ID="ID_1326942653" MODIFIED="1697636543682" TEXT="verify_postDispatch">
<icon BUILTIN="pencil"/>
<node CREATED="1697630618833" ID="ID_1032090324" MODIFIED="1697630748734" TEXT="Szenarien">
<linktarget COLOR="#9ca0a6" DESTINATION="ID_1032090324" ENDARROW="Default" ENDINCLINATION="-719;-92;" ID="Arrow_ID_1412557043" SOURCE="ID_1337049621" STARTARROW="None" STARTINCLINATION="-335;509;"/>
<icon BUILTIN="list"/>
<node CREATED="1697630760771" ID="ID_1390673717" MODIFIED="1697630771920" TEXT="keine Activity &#x27f9; kein Effekt"/>
<node CREATED="1697630796057" ID="ID_118687407" MODIFIED="1697630817180" TEXT="Activity in time &#x27f9; Aktivierung"/>
<node CREATED="1697630849573" ID="ID_508584323" MODIFIED="1697630936514" TEXT="Activity planned &#x27f9; Priority-Queue"/>
<node CREATED="1697630940709" ID="ID_338527854" MODIFIED="1697630968190" TEXT="kein Grooming &#x27f9; Instruct-Queue"/>
</node>
<node CREATED="1697631061046" ID="ID_1383947254" MODIFIED="1697636526674" TEXT="Instrumentierung">
<icon BUILTIN="info"/>
<node COLOR="#338800" CREATED="1697631069317" ID="ID_1294984944" MODIFIED="1697636528522" TEXT="verwende Activity-Detector">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1697631076959" ID="ID_1560926553" MODIFIED="1697636530700" TEXT="verwende ActivityProbe als Test-Activity">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697636534920" ID="ID_148488011" MODIFIED="1697636539419" TEXT="Match auf Event-Log">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697560591659" ID="ID_1581648425" MODIFIED="1697560620823" TEXT="integratedWorkCycle">
<icon BUILTIN="flag-yellow"/>
</node>