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:
parent
86b90fbf84
commit
86a909b850
3 changed files with 151 additions and 33 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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...
|
||||
|
|
|
|||
|
|
@ -82036,6 +82036,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1699245702520" ID="ID_1053537499" MODIFIED="1699245792944" TEXT="mö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-„Hintertür aus“" VSHIFT="-6"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -82075,20 +82077,26 @@ Date:   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:   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ühren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1699245577969" ID="ID_1964298619" MODIFIED="1699310570096" TEXT="post() ausfü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ären">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1699245611846" ID="ID_788545423" MODIFIED="1699307283267" TEXT="Definitions-Struktur und Code-Anordnung klä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ß 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ß wo?">
|
||||
<node COLOR="#435e98" CREATED="1699245761304" ID="ID_1282593493" MODIFIED="1699307270255" TEXT="eine Indirektion ist unvermeidbar; fragt sich bloß 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="⟹ ein static_cast genü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 — übergibt Activity-chain direkt">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1699306032400" ID="ID_569323828" MODIFIED="1699306243483" TEXT="Abkürzung der Details: Client arbeitet auf Builder— 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 — Delegation durch Indirektion verborgen">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1699306254805" ID="ID_899977043" MODIFIED="1699306360295" TEXT="Entscheidung fü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ät erleichtert den Umbang"/>
|
||||
<node CREATED="1699306377042" ID="ID_625828010" MODIFIED="1699306394839" TEXT="Einkapseln der technischen Abhöngigkeit ist unötig und verursacht Kosten"/>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1699306395766" ID="ID_403601529" MODIFIED="1699306672393" TEXT="komplettes Einkapseln — oder Zusammenlegen ist spä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ätzbar sind. Daher muß ich mir vor allem Erweiterungspunkte und Flexibilität schaffen. Wenn später einmal die Verwendungen der Engine weitgehend komplett überschaubar sind (einschließlich Hardware-Einbindung), dann wä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ß activity-lang.hpp includieren">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
⟶ Iter-explorer
|
||||
</p>
|
||||
<p>
|
||||
⟶ Format-util
|
||||
</p>
|
||||
<p>
|
||||
⟶ meta/trait
|
||||
</p>
|
||||
<p>
|
||||
⟹ für Implementierungs-Code ist das nicht weiter auffällig (die halbe Code-Basis includiert indirekt diese Header)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1699307032938" ID="ID_713637047" MODIFIED="1699307067129" TEXT="⟹ Scheduler selber wird über das Player-API angesprochen"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -84494,7 +84558,7 @@ Date:   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: λ-post ü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:   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="ü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="ü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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue