Scheduler: implement the render job builder

...simply by delegating to the underlying builder notation
on activity::Term as provided by the Activity-Language
This commit is contained in:
Fischlurch 2023-11-06 22:54:19 +01:00
parent 86b90fbf84
commit 86a909b850
3 changed files with 151 additions and 33 deletions

View file

@ -117,6 +117,7 @@
//#include "lib/util.hpp"
//#include <string>
#include <optional>
#include <utility>
@ -145,44 +146,50 @@ namespace gear {
}
class Scheduler;
class ScheduleSpec
: util::MoveAssign
{
Job job_;
TimeVar start_{Time::ANYTIME};
TimeVar death_{Time::NEVER};
ManifestationID manID_{};
bool isCompulsory_{false};
Scheduler& theScheduler_;
std::optional<activity::Term> term_;
public:
ScheduleSpec (Job job)
ScheduleSpec (Scheduler& sched, Job job)
: job_{job}
, theScheduler_{sched}
, term_{std::nullopt}
{ }
ScheduleSpec
startOffset (microseconds microTicks)
startOffset (microseconds afterNow)
{
UNIMPLEMENTED ("start offset");
start_ = RealClock::now() + _uTicks(afterNow);
return move(*this);
}
ScheduleSpec
lifeWindow (microseconds microTicks)
lifeWindow (microseconds afterStart)
{
UNIMPLEMENTED ("deadline relative to starts");
death_ = start_ + _uTicks(afterStart);
return move(*this);
}
ScheduleSpec
manifestation (ManifestationID manID)
{
UNIMPLEMENTED ("store manifestation-ID");
manID_ = manID;
return move(*this);
}
ScheduleSpec
post()
{
UNIMPLEMENTED ("build chain and hand-over into queue");
return move(*this);
}
/** build Activity chain and hand-over to the Scheduler. */
ScheduleSpec post();
};
@ -286,12 +293,16 @@ namespace gear {
/**
*
* Render Job builder: start definition of a schedule
* to invoke the given Job. Use the functions on the returned builder
* to fill in the details of the schedule; defining a start point and
* a deadline is mandatory. Issue this schedule then by invoking `post()`
* @warning the deadline is also used to manage the allocation.
*/
ScheduleSpec
defineSchedule (Job job)
{
UNIMPLEMENTED("wrap the ActivityTerm");
return ScheduleSpec{*this, job};
}
@ -365,6 +376,9 @@ namespace gear {
class ExecutionCtx;
friend class ExecutionCtx;
/** the Job builder is allowed to allocate and dispatch */
friend class ScheduleSpec;
/** open private backdoor for tests */
friend class test::SchedulerService_test;
};
@ -452,6 +466,31 @@ namespace gear {
/** @note after invoking this terminal operation,
* the schedule is defined and will be triggered
* when start time arrives. However, before reaching
* this trigger point, the embedded activity::Term can
* still be augmented and dependencies can be established.
* @remark This ScheduleSpec builder is disposable (and can be moved),
* while the actual Activities are allocated into the BlockFlow,
* where they are guaranteed to live until reaching the deadline.
*/
inline ScheduleSpec
ScheduleSpec::post()
{
term_ = move(
theScheduler_
.activityLang_
.buildCalculationJob (job_, start_,death_));
//set up new schedule by retrieving the Activity-chain...
theScheduler_.postChain ({term_->post(), start_
, death_
, manID_
, isCompulsory_});
return move(*this);
}
/**
* Enqueue for time-bound execution, possibly dispatch immediately.
* This is the »main entrance« to get some Activity scheduled.

View file

@ -459,7 +459,11 @@ namespace test {
ActivityDetector detector;
Job testJob{detector.buildMockJob("testJob", nominal, 1337)};
auto anchor = RealClock::now();
auto offset = [&](Time when =RealClock::now()){ return _raw(when) - _raw(anchor); };
//////////////////////////////////
CHECK (scheduler.empty());
SHOW_EXPR(offset())
scheduler.defineSchedule(testJob)
.startOffset(200us)
.lifeWindow (1ms)
@ -468,11 +472,15 @@ namespace test {
CHECK (not scheduler.empty());
CHECK (detector.ensureNoInvocation("testJob"));
SHOW_EXPR(offset())
sleep_for(400us);
CHECK (detector.ensureNoInvocation("testJob"));
SHOW_EXPR(offset())
CHECK (activity::PASS == scheduler.getWork());
auto res= scheduler.getWork();
SHOW_EXPR(res)
// CHECK (activity::PASS == scheduler.getWork());
CHECK (scheduler.empty());
cout << detector.showLog()<<endl; // HINT: use this for investigation...

View file

@ -82036,6 +82036,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1699245702520" ID="ID_1053537499" MODIFIED="1699245792944" TEXT="m&#xf6;glichst wenig virtuelle Funktionen">
<linktarget COLOR="#d06592" DESTINATION="ID_1053537499" ENDARROW="Default" ENDINCLINATION="212;16;" ID="Arrow_ID_1604416829" SOURCE="ID_1282593493" STARTARROW="None" STARTINCLINATION="319;-10;"/>
<icon BUILTIN="yes"/>
<node CREATED="1699307219569" ID="ID_679299594" MODIFIED="1699307229251" TEXT="wohl nur die Lebenszyklus-Funktionen"/>
<node CREATED="1699307236767" HGAP="52" ID="ID_1191488838" MODIFIED="1699307263822" TEXT="das scheduling-API kommt mit einer static_cast-&#x201e;Hintert&#xfc;r aus&#x201c;" VSHIFT="-6"/>
</node>
</node>
</node>
@ -82075,20 +82077,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#2f9552" DESTINATION="ID_492054934" ENDARROW="Default" ENDINCLINATION="-315;-355;" ID="Arrow_ID_1566437327" STARTARROW="None" STARTINCLINATION="253;14;"/>
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1697756908166" ID="ID_1142273023" MODIFIED="1699246415190" TEXT="Wrapper-Builder um den Activity-Term legen">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1697756908166" ID="ID_1142273023" MODIFIED="1699300683254" TEXT="Wrapper-Builder um den Activity-Term legen">
<linktarget COLOR="#f4336b" DESTINATION="ID_1142273023" ENDARROW="Default" ENDINCLINATION="-737;663;" ID="Arrow_ID_891496003" SOURCE="ID_175313196" STARTARROW="None" STARTINCLINATION="1218;-76;"/>
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698945250261" ID="ID_780386157" MODIFIED="1698946166942" TEXT="Zusatz-Angaben zur Relevanz">
<linktarget COLOR="#3d3aa9" DESTINATION="ID_780386157" ENDARROW="Default" ENDINCLINATION="69;74;" ID="Arrow_ID_103420327" SOURCE="ID_1778628995" STARTARROW="None" STARTINCLINATION="317;25;"/>
<linktarget COLOR="#3d3aa9" DESTINATION="ID_780386157" ENDARROW="Default" ENDINCLINATION="86;143;" ID="Arrow_ID_103420327" SOURCE="ID_1778628995" STARTARROW="None" STARTINCLINATION="317;25;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698947287399" ID="ID_391005911" LINK="#ID_1426746639" MODIFIED="1698947345862" TEXT="Job-Deadline auf API verpflichtend">
<icon BUILTIN="messagebox_warning"/>
<node COLOR="#5b280f" CREATED="1699310594544" ID="ID_1072047412" MODIFIED="1699310620293" TEXT="mit dem Builder-API nicht darstellbar">
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245520392" ID="ID_1677467445" MODIFIED="1699246079335" TEXT="Builder-Funktionen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245533215" ID="ID_1666620904" MODIFIED="1699246017062" TEXT="relative Zeitangabe">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1699310605911" ID="ID_169718532" MODIFIED="1699310630268" TEXT="kann nur eine Assertion einbauen">
<icon BUILTIN="flag-pink"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699245520392" ID="ID_1677467445" MODIFIED="1699310561557" TEXT="Builder-Funktionen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1699245533215" ID="ID_1666620904" MODIFIED="1699310551449" TEXT="relative Zeitangabe">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1699246024149" ID="ID_329731071" MODIFIED="1699246029581" TEXT="absolute Zeitangabe">
<icon BUILTIN="hourglass"/>
@ -82106,17 +82114,73 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1699245577969" ID="ID_1964298619" MODIFIED="1699246079334" TEXT="post() ausf&#xfc;hren">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1699245577969" ID="ID_1964298619" MODIFIED="1699310570096" TEXT="post() ausf&#xfc;hren">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1699245611846" ID="ID_788545423" MODIFIED="1699245919549" TEXT="Definitions-Struktur und Code-Anordnung kl&#xe4;ren">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699245611846" ID="ID_788545423" MODIFIED="1699307283267" TEXT="Definitions-Struktur und Code-Anordnung kl&#xe4;ren">
<arrowlink COLOR="#fedfb1" DESTINATION="ID_1883772504" ENDARROW="Default" ENDINCLINATION="-261;14;" ID="Arrow_ID_416423581" STARTARROW="None" STARTINCLINATION="242;-83;"/>
<arrowlink COLOR="#f5dffd" DESTINATION="ID_3688190" ENDARROW="Default" ENDINCLINATION="-410;-597;" ID="Arrow_ID_1041094005" STARTARROW="None" STARTINCLINATION="-664;318;"/>
<icon BUILTIN="flag-pink"/>
<icon BUILTIN="pencil"/>
<node CREATED="1699245733434" ID="ID_1697507405" MODIFIED="1699245746917" TEXT="die post()-Implementierung mu&#xdf; den eigentlichen Scheduler sehen"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1699245761304" ID="ID_1282593493" MODIFIED="1699245799661" TEXT="eine Indirektion ist unvermeidbar; fragt sich blo&#xdf; wo?">
<node COLOR="#435e98" CREATED="1699245761304" ID="ID_1282593493" MODIFIED="1699307270255" TEXT="eine Indirektion ist unvermeidbar; fragt sich blo&#xdf; wo?">
<arrowlink COLOR="#d06592" DESTINATION="ID_1053537499" ENDARROW="Default" ENDINCLINATION="212;16;" ID="Arrow_ID_1604416829" STARTARROW="None" STARTINCLINATION="319;-10;"/>
<icon BUILTIN="help"/>
<node CREATED="1699307091530" ID="ID_352699804" MODIFIED="1699307117123" TEXT="es gibt nur eine Scheduler-Service-Impl">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#435e98" CREATED="1699307118519" ID="ID_784854704" MODIFIED="1699307138868" TEXT="&#x27f9; ein static_cast gen&#xfc;gt"/>
<node CREATED="1699307150242" ID="ID_986871998" MODIFIED="1699307158109" TEXT="post()-Implementierung"/>
</node>
<node COLOR="#338800" CREATED="1699305925335" ID="ID_21620888" MODIFIED="1699307078602" TEXT="Grad der Entkopplung entscheiden">
<icon BUILTIN="yes"/>
<node CREATED="1699305942607" ID="ID_1503057791" MODIFIED="1699305946811" TEXT="Alternativen">
<node COLOR="#5b280f" CREATED="1699305947963" ID="ID_52546025" MODIFIED="1699306229621" TEXT="keine Entkopplung: Client arbeitet direct auf ActivityTerm &#x2014; &#xfc;bergibt Activity-chain direkt">
<icon BUILTIN="button_cancel"/>
</node>
<node COLOR="#435e98" CREATED="1699306032400" ID="ID_569323828" MODIFIED="1699306243483" TEXT="Abk&#xfc;rzung der Details: Client arbeitet auf Builder&#x2014; welcher auf ActivityTerm delegiert">
<icon BUILTIN="forward"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1699306100048" ID="ID_980919576" MODIFIED="1699306245580" TEXT="Einkapselung: Client arbeitet auf opaquem Builder &#x2014; Delegation durch Indirektion verborgen">
<icon BUILTIN="hourglass"/>
</node>
</node>
<node CREATED="1699306254805" ID="ID_899977043" MODIFIED="1699306360295" TEXT="Entscheidung f&#xfc;r die mittlere Alternative">
<icon BUILTIN="yes"/>
<node CREATED="1699306262945" ID="ID_1840668490" MODIFIED="1699306279907" TEXT="es erscheint mir sinnvoll, die Verwendung zu standardisieren"/>
<node CREATED="1699306282719" ID="ID_810994592" MODIFIED="1699306304119" TEXT="die Activity-Language ist sehr offen und leicht falsch zu verwenden"/>
<node CREATED="1699306321344" ID="ID_1621736115" MODIFIED="1699306346818" TEXT="Verbergen inhaltlicher Komplexit&#xe4;t erleichtert den Umbang"/>
<node CREATED="1699306377042" ID="ID_625828010" MODIFIED="1699306394839" TEXT="Einkapseln der technischen Abh&#xf6;ngigkeit ist un&#xf6;tig und verursacht Kosten"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1699306395766" ID="ID_403601529" MODIFIED="1699306672393" TEXT="komplettes Einkapseln &#x2014; oder Zusammenlegen ist sp&#xe4;ter noch denkbar">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Im Moment stehe ich for der Aufgabe, einen Scheduler-Mechanismus zu bauen, dessen konkrete Einsatzszenarien derzeit bestenfalls absch&#228;tzbar sind. Daher mu&#223; ich mir vor allem Erweiterungspunkte und Flexibilit&#228;t schaffen. Wenn sp&#228;ter einmal die Verwendungen der Engine weitgehend komplett &#252;berschaubar sind (einschlie&#223;lich Hardware-Einbindung), dann w&#228;re es sehr wohl denkbar, die Builder-Syntax und ggfs. sogar Teile der Activity-Language zu konsolidieren und festzulegen in wenige, explizite Funktionen auf dem Scheduler-API...
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1699306684201" ID="ID_1950436120" MODIFIED="1699306998148" TEXT="Konsequenz: Client mu&#xdf; activity-lang.hpp includieren">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
&#10230; Iter-explorer
</p>
<p>
&#10230; Format-util
</p>
<p>
&#10230; meta/trait
</p>
<p>
&#10233; f&#252;r Implementierungs-Code ist das nicht weiter auff&#228;llig (die halbe Code-Basis includiert indirekt diese Header)
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1699307032938" ID="ID_713637047" MODIFIED="1699307067129" TEXT="&#x27f9; Scheduler selber wird &#xfc;ber das Player-API angesprochen"/>
</node>
</node>
</node>
@ -84494,7 +84558,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698945215604" ID="ID_1778628995" MODIFIED="1698946166942" TEXT="Scheduler high-level-API erweitern">
<arrowlink COLOR="#3d3aa9" DESTINATION="ID_780386157" ENDARROW="Default" ENDINCLINATION="69;74;" ID="Arrow_ID_103420327" STARTARROW="None" STARTINCLINATION="317;25;"/>
<arrowlink COLOR="#3d3aa9" DESTINATION="ID_780386157" ENDARROW="Default" ENDINCLINATION="86;143;" ID="Arrow_ID_103420327" STARTARROW="None" STARTINCLINATION="317;25;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1698971859240" HGAP="82" ID="ID_1814368786" MODIFIED="1699237073393" TEXT="Problem: &#x3bb;-post &#xfc;bermittelt nicht zwingend eine Deadline" VSHIFT="17">
<linktarget COLOR="#4a4f75" DESTINATION="ID_1814368786" ENDARROW="Default" ENDINCLINATION="45;-42;" ID="Arrow_ID_463155049" SOURCE="ID_847681286" STARTARROW="None" STARTINCLINATION="-46;5;"/>
@ -92178,12 +92242,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699243246184" ID="ID_834498549" MODIFIED="1699245502339" TEXT="scheduleRenderJob">
<icon BUILTIN="pencil"/>
<node CREATED="1699243261338" ID="ID_266519660" MODIFIED="1699243272937" TEXT="verwendet einen Job vom ActivityDetector"/>
<node CREATED="1699243350122" ID="ID_175313196" MODIFIED="1699246395229" TEXT="&#xfc;bergibt den per Builder-API an den Scheduler">
<arrowlink COLOR="#f4336b" DESTINATION="ID_1142273023" ENDARROW="Default" ENDINCLINATION="-737;663;" ID="Arrow_ID_891496003" STARTARROW="None" STARTINCLINATION="1218;-76;"/>
<node COLOR="#338800" CREATED="1699243261338" ID="ID_266519660" MODIFIED="1699310655097" TEXT="verwendet einen Job vom ActivityDetector">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1699243350122" ID="ID_175313196" MODIFIED="1699310659416" TEXT="&#xfc;bergibt den per Builder-API an den Scheduler">
<arrowlink COLOR="#f4336b" DESTINATION="ID_1142273023" ENDARROW="Default" ENDINCLINATION="-737;663;" ID="Arrow_ID_891496003" STARTARROW="None" STARTINCLINATION="1218;-76;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1699243361425" ID="ID_565283839" MODIFIED="1699310662190" TEXT="ruft die work-Function direkt auf (keine WorkForce!)">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1699243391733" ID="ID_1214068544" MODIFIED="1699310666524" TEXT="verifiziert Aufruf per Log">
<icon BUILTIN="broken-line"/>
</node>
<node CREATED="1699243361425" ID="ID_565283839" MODIFIED="1699243380530" TEXT="ruft die work-Function direkt auf (keine WorkForce!)"/>
<node CREATED="1699243391733" ID="ID_1214068544" MODIFIED="1699243397136" TEXT="verifiziert Aufruf per Log"/>
</node>
</node>
</node>