Scheduler-test: adapt λ-post to include deadline info

...it seems impossible to solve this conundrum other than by
opening a path to override a contextual deadline setting from
within the core Activity-Language logic.

This will be used in two cases
 - when processing a explicitly coded POST (using deadline from the POST)
 - after successfully opening a Gate by NOTIFY (using deadline from Gate)

All other cases can now supply Time::NEVER, thereby indicating that
the processing layer shall use contextual information (intersection
of the time intervals)
This commit is contained in:
Fischlurch 2023-12-13 19:42:38 +01:00
parent 3bf3ca095b
commit 206c67cc8a
6 changed files with 92 additions and 115 deletions

View file

@ -211,7 +211,7 @@ namespace gear {
constexpr void
_verify_usable_as_ExecutionContext ()
{
ASSERT_MEMBER_FUNCTOR (&EXE::post, Proc(Time, Activity*, EXE&));
ASSERT_MEMBER_FUNCTOR (&EXE::post, Proc(Time, Time, Activity*, EXE&));
ASSERT_MEMBER_FUNCTOR (&EXE::work, void(Time, size_t));
ASSERT_MEMBER_FUNCTOR (&EXE::done, void(Time, size_t));
ASSERT_MEMBER_FUNCTOR (&EXE::tick, Proc(Time));
@ -292,6 +292,14 @@ namespace gear {
bool isHold () const { return rest > 0; }
bool isFree (Time now) const { return not (isHold() or isDead(now)); }
void incDependencies() { ++rest; }
Time
lockPermanently()
{
auto oldDeadline{dead};
dead = Time::MIN;
return Time{oldDeadline};
}
};
/** Time window to define for activation */
@ -557,33 +565,33 @@ namespace gear {
// maybe the Gate has been opened by this notification?
if (data_.condition.isFree(now))
{//yes => activate gated chain but lock redundant invocations
data_.condition.dead = Time::MIN;
return postChain (now, executionCtx);
Time dead = data_.condition.lockPermanently();
return postChain (now,dead, executionCtx);
} }
return activity::PASS;
}
template<class EXE>
activity::Proc
dispatchSelf (Time when, EXE& executionCtx)
dispatchSelf (Time when, Time dead, EXE& executionCtx)
{
return executionCtx.post (when, this, executionCtx);
return executionCtx.post (when, dead, this, executionCtx);
}
template<class EXE>
activity::Proc
dispatchSelfDelayed (Time now, EXE& executionCtx)
dispatchSelfDelayed (Time now, Time dead, EXE& executionCtx)
{
dispatchSelf (now + executionCtx.getWaitDelay(), executionCtx);
dispatchSelf (now + executionCtx.getWaitDelay(), dead, executionCtx);
return activity::SKIP;
}
template<class EXE>
activity::Proc
postChain (Time when, EXE& executionCtx)
postChain (Time when, Time dead, EXE& executionCtx)
{
REQUIRE (next);
return executionCtx.post (when, next, executionCtx);
return executionCtx.post (when, dead, next, executionCtx);
}
template<class EXE>
@ -646,7 +654,7 @@ namespace gear {
case GATE:
return checkGate (now, executionCtx);
case POST:
return dispatchSelf (Time{data_.timeWindow.life}, executionCtx);
return dispatchSelf (Time{data_.timeWindow.life},Time{data_.timeWindow.dead}, executionCtx);
case FEED:
return activity::PASS;
case HOOK:
@ -713,10 +721,10 @@ namespace gear {
case HOOK:
return notifyHook (now, executionCtx);
case POST:
case FEED:
return postChain (now, executionCtx);
case FEED: // ▽▽▽▽▽ implies to use a deadline from the context
return postChain (now,Time::NEVER, executionCtx);
default:
return dispatchSelfDelayed (now, executionCtx);
return dispatchSelfDelayed (now,Time::NEVER, executionCtx);
} // Fallback: self-re-dispatch for async execution (-> getWaitDelay())
}

View file

@ -505,13 +505,13 @@ namespace gear {
* down here as a nested sub-context.
*/
activity::Proc
post (Time when, Activity* chain, ExecutionCtx& ctx)
post (Time when, Time dead, Activity* chain, ExecutionCtx& ctx)
{
REQUIRE (chain);
ActivationEvent chainEvent = ctx.rootEvent;
chainEvent.activity = chain;
chainEvent.starting = _raw(chain->constrainedStart (when));
chainEvent.deadline = _raw(chain->constrainedDeath (chainEvent.deathTime()));
chainEvent.deadline = _raw(chain->constrainedDeath (dead.isRegular()? dead:chainEvent.deathTime()));
ExecutionCtx subCtx{scheduler_, chainEvent};
return scheduler_.layer2_.postDispatch (chainEvent, subCtx, scheduler_.layer1_);
}

View file

@ -218,6 +218,7 @@ namespace test {
activity::_verify_usable_as_ExecutionContext<decltype(detector.executionCtx)>();
Time t = randTime();
Time td{t+Time(0,1)};
size_t x = rand();
Activity a;
@ -232,8 +233,8 @@ namespace test {
ctx.done (t,x);
CHECK (detector.verifyInvocation(CTX_DONE).arg(t,x));
CHECK (activity::PASS == ctx.post (t, &a, ctx));
CHECK (detector.verifyInvocation(CTX_POST).arg(t,&a,ctx));
CHECK (activity::PASS == ctx.post (t,td, &a, ctx));
CHECK (detector.verifyInvocation(CTX_POST).arg(t,td,&a,ctx));
CHECK (activity::PASS == ctx.tick(t));
CHECK (detector.verifyInvocation(CTX_TICK).arg(t));
@ -362,7 +363,7 @@ namespace test {
ActivityDetector detector;
Activity chain;
Activity gate{1};
Activity gate{1, Time{22,22}};
gate.next = &chain;
Activity notification{&gate};
CHECK (gate.data_.condition.rest == 1);
@ -373,7 +374,7 @@ namespace test {
notification.dispatch (tt, detector.executionCtx);
CHECK (detector.verifyInvocation("tap-GATE").arg("11.011 --notify-↯> Act(GATE")
.beforeInvocation("CTX-post").arg("11.011", "Act(TICK", "≺test::CTX≻"));
.beforeInvocation("CTX-post").arg("11.011","22.022", "Act(TICK", "≺test::CTX≻"));
CHECK (gate.data_.condition.rest == 0);
}

View file

@ -572,7 +572,7 @@ namespace test {
struct FakeExecutionCtx;
using SIG_post = activity::Proc(Time, Activity*, FakeExecutionCtx&);
using SIG_post = activity::Proc(Time, Time, Activity*, FakeExecutionCtx&);
using SIG_work = void(Time, size_t);
using SIG_done = void(Time, size_t);
using SIG_tick = activity::Proc(Time);

View file

@ -125,7 +125,7 @@ namespace test {
Time tt{5,5};
post.activate (tt, detector.executionCtx);
CHECK (detector.verifyInvocation("CTX-post").arg("11.000", "Act(POST", "≺test::CTX≻"));
CHECK (detector.verifyInvocation("CTX-post").arg("11.000","22.000", "Act(POST", "≺test::CTX≻"));
}
@ -157,8 +157,13 @@ namespace test {
/** @test behaviour of Activity::NOTIFY when _activated_
* - notification is dispatched as special message to an indicated target Activity
* - when activated, a `NOTIFY`-Activity _posts itself_ through the Execution Context hook
* - this way, further processing will happen in management mode (single threaded)
* - when activated, a `NOTIFY`-Activity _dispatches_ into the Activity::notify()
* of the target Activity
* - what happens then depends on the target
* - usually the target is a `GATE` (see below), but here for sake of simplicity,
* a `TICK`-Activity is used; on notification, this will _post_ itself as new task,
* with a delay retrieved from context (here configured to be +1sec), and without
* specifying a deadline (thus a deadline from the context will be used).
*/
void
verifyActivity_Notify_activate()
@ -170,7 +175,7 @@ namespace test {
Time tt{111,11};
notify.activate (tt, detector.executionCtx);
CHECK (detector.verifyInvocation("CTX-post").arg("11.111", "Act(NOTIFY", "≺test::CTX≻"));
CHECK (detector.verifyInvocation("CTX-post").arg("12.111", Time::NEVER, "Act(TICK", "≺test::CTX≻"));
}
@ -286,20 +291,21 @@ namespace test {
void
verifyActivity_Gate_opened()
{
Time tt{333,33};
Time td{555,55};
Activity chain;
Activity gate{1};
Activity gate{1,td};
gate.next = &chain;
// Conditionals in the gate block invocations
CHECK (gate.data_.condition.isHold());
CHECK (gate.data_.condition.rest == 1);
CHECK (gate.data_.condition.dead == Time::NEVER);
CHECK (gate.data_.condition.dead == td);
ActivityDetector detector;
Activity& wiring = detector.buildGateWatcher (gate);
Time tt{333,33};
// an attempt to activate blocks (returing SKIP, nothing else happens)
// an attempt to activate blocks (returning SKIP, nothing else happens)
CHECK (activity::SKIP == wiring.activate (tt, detector.executionCtx));
CHECK (1 == gate.data_.condition.rest); // unchanged (and locked)...
CHECK (detector.verifyInvocation("tap-GATE").arg("33.333 ⧐ Act(GATE"));
@ -311,7 +317,7 @@ namespace test {
CHECK (detector.verifyInvocation("tap-GATE").seq(0).arg("33.333 ⧐ Act(GATE")
.beforeInvocation("tap-GATE").seq(1).arg("33.333 --notify-↯> Act(GATE")
.beforeInvocation("CTX-post").seq(1).arg(tt, "after-GATE", "≺test::CTX≻"));
.beforeInvocation("CTX-post").seq(1).arg(tt,td, "after-GATE", "≺test::CTX≻"));
CHECK (gate.data_.condition.dead == Time::MIN);
detector.incrementSeq();
@ -392,8 +398,7 @@ namespace test {
* - use a directly wired, arbitrary chain
* - dispatch will activate all Activities
* - however, when the Gate is configured to be blocked
* (waiting on prerequisites), then the rest of the chain is not activated,
* only a re-check of the Gate is scheduled for later (1.011 -> 2.011)
* (waiting on prerequisites), then the rest of the chain is not activated.
* - the dispatch function also handles the notifications;
* when a notification towards the Gate is dispatched, the Gate is
* decremented and thereby opened; activation of the rest of the chain
@ -403,8 +408,9 @@ namespace test {
dispatchChain()
{
Time tt{11,1};
Time td{22,2};
Activity tick;
Activity gate{0};
Activity gate{0,td};
gate.next = &tick;
Activity post{tt, &gate};
// so now we have POST ⟶ GATE ⟶ TICK;
@ -433,7 +439,7 @@ namespace test {
CHECK (activity::PASS == ActivityLang::dispatchChain (&notify, detector.executionCtx)); // dispatch a notification (case/seq == 2)
CHECK (detector.verifyInvocation("Gate") .seq(2).arg("1.011 --notify-↯> Act(GATE") // ...notification dispatched towards the Gate
.beforeInvocation("CTX-post").seq(2).arg("1.011","after-Gate","≺test::CTX≻")); // ...this opened the Gate and posted/requested activation of the rest of the chain
.beforeInvocation("CTX-post").seq(2).arg("1.011","2.022","after-Gate","≺test::CTX≻")); // ...this opened the Gate and posted follow-up chain
CHECK (detector.ensureNoInvocation("after-Gate").seq(2) // verify that activation was not passed out directly
.afterInvocation("CTX-post").seq(2));
CHECK (detector.ensureNoInvocation("CTX-tick").seq(2) // verify also the λ-tick was not invoked directly
@ -530,7 +536,7 @@ namespace test {
// rig the λ-post to forward dispatch as expected in real usage
detector.executionCtx.post.implementedAs(
[&](Time when, Activity* postedAct, auto& ctx)
[&](Time when, Time, Activity* postedAct, auto& ctx)
{
if (when == ctx.getSchedTime()) // only for POST to run „right now“
return ActivityLang::dispatchChain (postedAct, ctx);
@ -548,10 +554,9 @@ namespace test {
///// Case-2 : now activate the primary-chain
detector.incrementSeq();
CHECK (activity::PASS == ActivityLang::dispatchChain (&anchor, detector.executionCtx));
CHECK (detector.verifyInvocation("CTX-post").seq(1).arg("5.555","Act(NOTIFY","≺test::CTX≻") // immediately at begin, the internal self-notification is posted
.beforeInvocation("deBlock") .seq(1).arg("5.555 --notify-↯> Act(GATE") // ...and then dispatched recursively via ActivityLang::dispatchChain() towards the Gate
CHECK (detector.verifyInvocation("deBlock") .seq(1).arg("5.555 --notify-↯> Act(GATE") // immediately at begin, the internal self-notification is dispatched towards the Gate
.arg("<1, until 0:00:10.000") // Note: at this point, the Gate-latch expects 1 notifications
.beforeInvocation("CTX-post").seq(1).arg("5.555","after-theGate","≺test::CTX≻") // ==> the latch was decremented and the Gate OPENS, and thus post() the tail-chain
.beforeInvocation("CTX-post").seq(1).arg("5.555","10.0","after-theGate","≺test::CTX≻") //==> latch was decremented, Gate OPENS, posting the tail-chain with Deadline from Gate
.beforeInvocation("after-theGate") .arg("5.555 ⧐ Act(WORKSTART") // ...causing the activation to pass behind the Gate
.beforeInvocation("CTX-work").seq(1).arg("5.555","") // ...through WORKSTART
.beforeInvocation("testJob") .seq(1).arg("7.007",12345) // ...then invoke the JobFunctor itself (with the nominal Time{7,7})
@ -626,7 +631,7 @@ namespace test {
detector.incrementSeq();
CHECK (activity::PASS == ActivityLang::dispatchChain (&notify, detector.executionCtx));
CHECK (detector.verifyInvocation("CTX-done").seq(1).arg("5.555", "") // activation of WORKSTOP via callback
.beforeInvocation("CTX-post").seq(1).arg("5.555", "Act(NOTIFY", "≺test::CTX≻")); // the following NOTIFY is posted...
.beforeInvocation("CTX-post").seq(1).arg("5.555","10.0","WORKSTART","≺test::CTX≻"));// the attached chain is activated, POSTing the second Activity
}

View file

@ -81224,8 +81224,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1702433393182" HGAP="52" ID="ID_747751692" MODIFIED="1702438946061" TEXT="Bedeutung des ExecutionContext.post()" VSHIFT="7">
<icon BUILTIN="forward"/>
<node CREATED="1702433169325" ID="ID_1315478968" MODIFIED="1702441747966" TEXT="Analyse: wie wird ctx.POST angewendet">
<linktarget COLOR="#5e61a8" DESTINATION="ID_1315478968" ENDARROW="Default" ENDINCLINATION="-1360;99;" ID="Arrow_ID_712536449" SOURCE="ID_1967102814" STARTARROW="None" STARTINCLINATION="-1113;94;"/>
<linktarget COLOR="#c9e1ff" DESTINATION="ID_1315478968" ENDARROW="Default" ENDINCLINATION="284;-24;" ID="Arrow_ID_1338379371" SOURCE="ID_1782073757" STARTARROW="None" STARTINCLINATION="-364;17;"/>
<linktarget COLOR="#5e61a8" DESTINATION="ID_1315478968" ENDARROW="Default" ENDINCLINATION="-1360;99;" ID="Arrow_ID_712536449" SOURCE="ID_1967102814" STARTARROW="None" STARTINCLINATION="-1113;94;"/>
<icon BUILTIN="info"/>
<node CREATED="1702434084113" ID="ID_1294306408" MODIFIED="1702434087837" TEXT="postChain">
<node CREATED="1702434189245" ID="ID_1880105222" MODIFIED="1702434221580" TEXT="receiveGateNotification &#x27f6; pass">
@ -93490,16 +93490,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1702409413423" ID="ID_173246700" MODIFIED="1702409417624" TEXT="spiele etwas mit dem Seed">
<node CREATED="1702409419934" ID="ID_1363362334" MODIFIED="1702409484821" TEXT="hoher Seed &#x27f9; sofort sehr massiv">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
wie im Beispiel im Test: seed=62 &#10233; sehr schnell ein Expand und dann mehrere massive Wellen die bis an den Anschlag gehen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1702409486157" ID="ID_1757389118" MODIFIED="1702409515942" TEXT="niedriger Seed &#x27f9; l&#xe4;uft erst mal linear mit kurzen Expansionen"/>
<node CREATED="1702409518321" ID="ID_886437201" MODIFIED="1702409524299" TEXT="2 sieht da interessant aus"/>
@ -93517,32 +93514,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1702409630298" ID="ID_1073213394" MODIFIED="1702409635845" TEXT="aber nur wennn...."/>
<node CREATED="1702409636451" ID="ID_915348913" MODIFIED="1702410224249" TEXT="...man diesen Testfall alleine laufen l&#xe4;&#xdf;t">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...denn <i>normalerweise</i>&#160;ist ein calibrate() <i>ganz vertr&#228;umt </i>&#160; (und sicher nicht zuf&#228;llig) im ersten simpleUsage-Example versteckt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1702409646091" ID="ID_483678836" MODIFIED="1702409654968" TEXT="Schei&#xdf; Seiteneffekte">
<icon BUILTIN="smiley-angry"/>
</node>
<node CREATED="1702409658182" ID="ID_578883137" MODIFIED="1702410169708" TEXT="einen calibrate() in einem extra-Lauf &#x201e;verstecken&#x201c;">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
angeblich um zu demonstrieren, da&#223; der Hash gleich ist...
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<linktarget COLOR="#f42e6f" DESTINATION="ID_578883137" ENDARROW="Default" ENDINCLINATION="-517;28;" ID="Arrow_ID_34504322" SOURCE="ID_1297902680" STARTARROW="None" STARTINCLINATION="89;-97;"/>
</node>
</node>
@ -93625,9 +93616,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="help"/>
<node CREATED="1702345592854" ID="ID_1087381356" MODIFIED="1702345637011" TEXT="b8e52d008c15d">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
2023-09-07 17:15:25
@ -93641,9 +93630,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1702345675963" ID="ID_569519663" MODIFIED="1702346301584" TEXT="lt.Changeset: versehentliches Abrunden auf Gr&#xf6;&#xdf;e 0"/>
<node CREATED="1702346302288" ID="ID_1943758650" MODIFIED="1702346400530" TEXT="das erscheint mir nun etwas &#xfc;bervorsichtig">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
es pa&#223;t nicht zum Stil im gesamten Kontext; wir sind hier in Implementierungs-Code, der grunds&#228;tzlich davon ausgeht, nur sinnvoll aufgerufen zu werden &#8212; es geht nicht darum, einen User &#8222;an die Hand zu nehmen&#8220;
@ -93674,9 +93661,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1702409721278" ID="ID_1297902680" MODIFIED="1702410169708">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
ist das angemessen,
@ -93694,9 +93679,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="info"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1702409933988" ID="ID_31420496" MODIFIED="1702410129406">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
so manches an diesen Tests hier funktioniert nur<i>&#160;scheinbar &#8222;einfach&#8220;</i>
@ -103124,16 +103107,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1702419936169" ID="ID_418237160" MODIFIED="1702419948039" TEXT="mit default-Load = 100&#xb5;s"/>
<node CREATED="1702419982175" ID="ID_1284746634" MODIFIED="1702420397432" TEXT="das w&#xe4;ren 62% Overhead">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
164.458 / 1.016*100&#181;s - 1
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1702420028048" ID="ID_672848707" MODIFIED="1702420034443" TEXT="zum Vergleich: die 1.Kette">
@ -103165,16 +103145,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1702426755535" ID="ID_1154244224" MODIFIED="1702426773616" TEXT="und zwar werden die post-Contiuations nicht aufgegriffen"/>
<node CREATED="1702426798353" ID="ID_550371173" MODIFIED="1702426826082" TEXT="offensichtlich wurden solche eingestellt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
in einem Fall sehe ich das sogar in einer Zeile als &quot;HT&quot; (head time)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1702426828833" ID="ID_1674499584" MODIFIED="1702426860236" TEXT="wenn diese nicht dispatched werden, bleibt die ganze Kette stecken"/>
<node BACKGROUND_COLOR="#b7e4d6" COLOR="#338800" CREATED="1702426865896" ID="ID_473730005" MODIFIED="1702426894031" TEXT="insofern ist das hier ein guter Test">
@ -103188,16 +103165,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1702430837918" ID="ID_1202301863" MODIFIED="1702431062199">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
man sieht sofort wo das Problem liegt: die <b>Deadlines </b><font size="6">&#9760;</font>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="idea"/>
<node CREATED="1702431166600" ID="ID_1215797939" MODIFIED="1702431179836" TEXT="in langen Ketten drehen die ins Negative"/>
<node CREATED="1702431180690" ID="ID_1037806616" MODIFIED="1702431234938" TEXT="bei direktem Dispatch wird die Deadline nicht beachtet"/>
@ -103205,16 +103179,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#a50181" CREATED="1702431274129" ID="ID_1271232700" MODIFIED="1702431340698">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
nebenbei bemerkt: <i>jeder </i>Dispatch geht auch <b>nochmal </b>durch ctx.post
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1702441820810" ID="ID_848678291" MODIFIED="1702441828412" TEXT="genauere Analyse: das ist nicht jedes..."/>
<node CREATED="1702441829015" ID="ID_1855571138" MODIFIED="1702441842982" TEXT="sondern die follow-up-Continuations"/>
@ -103229,16 +103200,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="clanbomber"/>
<node CREATED="1702431945679" ID="ID_762604723" MODIFIED="1702432270403" TEXT="das ist ein von Anfang an bestehendes Design-Problem">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und zwar liegt die Wurzel in der <i>Offenheit</i>&#160;der Activity-Language; ich wollte (und will) diese nicht auf eine Implementierungs-Logik des Schedulers reduzieren; dadurch sind Redundanzen entstanden, und aus logischen Gr&#252;nden <i>m&#252;&#223;te eingentlich </i>das Zeitfenster [start,dead] vom initialen POST am Anfang der Kette gelten, zumindes &#187;sinngem&#228;&#223;&#171;
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1702432271380" ID="ID_1197394588" LINK="#ID_491166338" MODIFIED="1702432408105" TEXT="die inzwischen gefundene L&#xf6;sung teilt die Belange in Schichten ein">
<node CREATED="1702432577860" ID="ID_52261721" MODIFIED="1702432609300" TEXT="die ActivityLanguage bestimmt ihre Terme allgemein / semantisch"/>
@ -103251,29 +103219,23 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1702432925363" ID="ID_35833830" MODIFIED="1702432944782" TEXT="&#x21af; das widerspricht dem Sinn einer Notification"/>
<node CREATED="1702432950945" ID="ID_1056912258" MODIFIED="1702432971284">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<i>wenn &#252;berhaupt</i>, sollte die Deadline des Target gelten
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1702432996363" ID="ID_848803014" MODIFIED="1702433132528" TEXT="nicht diejenige der Quelle (die ja mit dem Gate-pass abgehakt ist)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Deadlines betreffen <i>die Aktivierung. </i>Es ist die Aufgabe des Job-Planning, das per Verkettung zur&#252;ckzuf&#252;hren auf die gew&#252;nschte Ankunftszeit. Die Activity-Language k&#246;nnte das gar nicht tun, denn ihr fehlt dazu die Information &#252;ber Erfahrungswerte die Ausf&#252;hrungszeit betreffend
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1702433205565" ID="ID_1967102814" MODIFIED="1702441754071" TEXT="zur&#xfc;ck zur Requirement-Analyse">
@ -103286,22 +103248,22 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1702443203400" ID="ID_1322656086" MODIFIED="1702443211356" TEXT="sondern liegt auf dem Stack"/>
<node CREATED="1702443212207" ID="ID_1744471228" MODIFIED="1702443286350" TEXT="und das ist gut so">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Der Code ist wirklich performance-kritisch, und bis jetzt hab ich richtig gute Werte erziehlt, durch genau diese Art <i>Ma&#223;nahmen.</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1702443418356" HGAP="46" ID="ID_988047076" MODIFIED="1702443438585" TEXT="....und au&#xdf;erdem ein Zielkonflikt">
<node CREATED="1702443442537" ID="ID_1364345409" MODIFIED="1702443458610" TEXT="die Deadlines sichern die Allokation ab"/>
<node CREATED="1702443464630" ID="ID_1315697002" MODIFIED="1702443488798" TEXT="andererseits w&#xfc;rde ich gerne solche Kaskaden ohne Beschr&#xe4;nkung durchlaufen lassen"/>
<node COLOR="#435e98" CREATED="1702492092367" ID="ID_760218121" MODIFIED="1702492629377" TEXT="&#x27f9; nur l&#xf6;sbar wenn man die Deadline aus de &#xbb;Sprach-Ebene&#xab; heraus &#xfc;bersteuern kann">
<arrowlink COLOR="#a6acc3" DESTINATION="ID_243807249" ENDARROW="Default" ENDINCLINATION="83;0;" ID="Arrow_ID_1148415470" STARTARROW="None" STARTINCLINATION="-197;7;"/>
</node>
</node>
</node>
</node>
@ -103312,11 +103274,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#51a8aa" DESTINATION="ID_1861186167" ENDARROW="Default" ENDINCLINATION="358;14;" ID="Arrow_ID_926842783" SOURCE="ID_1209140162" STARTARROW="None" STARTINCLINATION="-197;8;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1702482072981" ID="ID_243807249" MODIFIED="1702490641549" TEXT="die M&#xf6;glichkeit schaffen, Deadlines explizit in &#x3bb;-Post zu &#xfc;bersteuern">
<node COLOR="#338800" CREATED="1702482072981" ID="ID_243807249" MODIFIED="1702492629377" TEXT="die M&#xf6;glichkeit schaffen, Deadlines explizit in &#x3bb;-Post zu &#xfc;bersteuern">
<linktarget COLOR="#a6acc3" DESTINATION="ID_243807249" ENDARROW="Default" ENDINCLINATION="83;0;" ID="Arrow_ID_1148415470" SOURCE="ID_760218121" STARTARROW="None" STARTINCLINATION="-197;7;"/>
<icon BUILTIN="yes"/>
<node COLOR="#435e98" CREATED="1702492593572" HGAP="54" ID="ID_1343967653" MODIFIED="1702492617089" TEXT="falls nicht gegeben: mit Deadline aus Ctx schneiden" VSHIFT="8">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1702490647104" ID="ID_805768437" MODIFIED="1702490678612" TEXT="Deadline vom Empf&#xe4;nger f&#xfc;r follow-up-Continuation nutzen">
<icon BUILTIN="flag-pink"/>
</node>
<node COLOR="#338800" CREATED="1702490647104" ID="ID_805768437" MODIFIED="1702492083661" TEXT="Deadline vom Empf&#xe4;nger f&#xfc;r follow-up-Continuation nutzen">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
@ -103352,16 +103318,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1702429685693" ID="ID_1578421379" MODIFIED="1702429701767" TEXT="es ist ein isoliertes Teilph&#xe4;nomen von unklarer Relevanz"/>
<node CREATED="1702429717649" ID="ID_587876448" MODIFIED="1702429776011" TEXT="die Messung ist mit erheblichen Unsicherheiten behaftet">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
ich wei&#223; nicht, wie gut die CPU-Lasterzeugung funktioniert; Wohl m&#246;glich, da&#223; Cache-Effekte die tats&#228;chliche Zeit in de H&#246;he treiben
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1702429778231" ID="ID_1205464082" MODIFIED="1702429799817" TEXT="die Overheads sind im Bereich der Me&#xdf;ungenauigkeit"/>
</node>