Scheduler: support for classification data in Layer-1

- this is prerequisite to check for significance of the head entry
- implement and verify the information functions at Layer-1
This commit is contained in:
Fischlurch 2023-11-02 22:25:19 +01:00
parent 7887941c89
commit d622b59dfd
5 changed files with 311 additions and 64 deletions

View file

@ -50,7 +50,7 @@ namespace gear {
HashVal
hash_value (ManifestationID const& id)
{
return hash_value (uint32_t{id});
return boost::hash_value (uint32_t{id});
}
///////////////////////////////////////////////////////////////////////////////////////////////TODO extract scheduler-API

View file

@ -49,9 +49,11 @@
#include "lib/nocopy.hpp"
#include "vault/gear/activity.hpp"
#include "lib/time/timevalue.hpp"
#include "lib/util.hpp"
#include <queue>
#include <boost/lockfree/queue.hpp>
#include <unordered_set>
#include <utility>
namespace vault{
@ -72,6 +74,7 @@ namespace gear {
* Manages pointers to _Render Activity records._
* - new entries passed in through the #instruct_ queue
* - time based prioritisation in the #priority_ queue
* @warning not threadsafe; requires Layer-2 to coordinate.
* @see Scheduler
* @see SchedulerInvocation_test
*/
@ -88,6 +91,7 @@ namespace gear {
uint32_t manifestationID :32;
char :0;
bool isCompulsory :1;
///////////////////////////////////////////////////////////////////////////TICKET #1245 : use direct bit-field initialiser in C++20
/** @internal ordering function for time based scheduling
* @note reversed order as required by std::priority_queue
@ -98,21 +102,22 @@ namespace gear {
{
return waterlevel > o.waterlevel;
}
ActOrder() =default; //////////////////////////////////////////////////////////////////////////////TICKET #1245 : use direct bit-field initialiser in C++20
};
using InstructQueue = boost::lockfree::queue<ActOrder>;
using PriorityQueue = std::priority_queue<ActOrder>;
using ActivationSet = std::unordered_set<ManifestationID>;
InstructQueue instruct_;
PriorityQueue priority_;
ActivationSet allowed_;
public:
SchedulerInvocation()
: instruct_{INITIAL_CAPACITY}
, priority_{}
, allowed_{}
{ }
@ -201,6 +206,26 @@ namespace gear {
return activity;
}
/**
* Enable entries marked with a specific ManifestationID to be processed.
* By default, entries are marked with the default ManifestationID, which
* is always implicitly activated. Any other ID must be actively allowed,
* otherwise the entry is deemed [outdated](\ref isOutdated) and will
* be silently discarded in regular processing by Layer-2.
* @remark this feature allows to supersede part of a schedule
*/
void
activate (ManifestationID manID)
{
allowed_.insert (manID);
}
void
drop (ManifestationID manID)
{
allowed_.erase (manID);
}
/* ===== query functions ===== */
@ -211,12 +236,41 @@ namespace gear {
return not priority_.empty()
and priority_.top().waterlevel <= waterLevel(now);
}
/** detect a compulsory Activity with missed deadline */
/** determine if Activity at scheduler head missed it's deadline
* @warning due to memory management, such an Activity must not be dereferenced */
bool
isOutOfTime() const
isMissed (Time now) const
{
return false; /////////////////////////////////////////////////////////////////OOO compulsory Activities
return not priority_.empty()
and waterLevel(now) > priority_.top().deathlevel;
}
/** determine if Activities with the given ManifestationID shall be processed */
bool
isActivated (ManifestationID manID) const
{
return manID == ManifestationID()
or util::contains (allowed_, manID);
}
/** determine if Activity at scheduler is outdated and should be discarded */
bool
isOutdated (Time now) const
{
return isMissed (now)
or (not priority_.empty()
and not isActivated (priority_.top().manifestationID));
}
/** detect a compulsory Activity at scheduler head with missed deadline */
bool
isOutOfTime (Time now) const
{
return isMissed (now)
and (not priority_.empty()
and priority_.top().isCompulsory
and isActivated (priority_.top().manifestationID));
}
bool

View file

@ -518,7 +518,7 @@ namespace gear {
// consolidate queue content
layer1_.feedPrioritisation();
//////////////////////////////////////////////////////////////////////OOO clean-up of outdated tasks here
if (layer1_.isOutOfTime())
if (layer1_.isOutOfTime (now))
{
triggerEmergency();
return; // leave everything as-is

View file

@ -69,10 +69,11 @@ namespace test {
SchedulerInvocation sched;
Activity activity;
Time when{1,2,3};
Time dead{2,3,4};
CHECK (not sched.peekHead());
sched.instruct (activity, when);
sched.instruct (activity, when, dead);
sched.feedPrioritisation();
CHECK (sched.peekHead());
@ -106,6 +107,7 @@ namespace test {
CHECK (isSameObject (*sched.pullHead(), two));
CHECK (isSameObject (*sched.pullHead(), ree));
CHECK (not sched.peekHead());
CHECK (sched.empty());
}
@ -142,36 +144,6 @@ namespace test {
/** @test verify that obsoleted or rejected entries are dropped transparently
*/
void
verify_Significance()
{
SchedulerInvocation sched;
Activity a1{1u,1u};
Activity a2{2u,2u};
Activity a3{3u,3u};
Activity a4{4u,4u};
UNIMPLEMENTED ("transparentely discard obsoleted entries from schedule");
sched.instruct (a2, Time{2,0});
sched.instruct (a4, Time{4,0});
sched.feedPrioritisation();
CHECK (isSameObject (*sched.peekHead(), a2));
sched.instruct (a3, Time{3,0});
sched.instruct (a1, Time{1,0});
CHECK (isSameObject (*sched.peekHead(), a2));
sched.feedPrioritisation();
CHECK (isSameObject (*sched.pullHead(), a1));
CHECK (isSameObject (*sched.pullHead(), a2));
CHECK (isSameObject (*sched.pullHead(), a3));
CHECK (isSameObject (*sched.pullHead(), a4));
}
/** @test sort order is not necessarily stable
* if using identical time specs on entrance
*/
@ -217,6 +189,97 @@ namespace test {
CHECK (not sched.isDue (Time{0,1}));
CHECK (not sched.isDue (Time{0,10}));
}
/** @test verify that obsoleted or rejected entries are dropped transparently
* - add entries providing extra information regarding significance
* - verify that missing the deadline is detected
* - entries past deadline are marked _outdated_ (will be dropped by Layer-2)
* - entries can be tagged with an ManifestationID, allowing to enable
* or disable visibility for a »family« of schedule entries
* - use the flag for _compulsory_ entries, allowing to detect
* a fatal _jammed_ situation where the head entry is
* out of time, while marked mandatory to process.
*/
void
verify_Significance()
{
SchedulerInvocation sched;
Activity act;
sched.feedPrioritisation (act, Time{2,0}, Time{3,0});
CHECK (Time(2,0) == sched.headTime());
CHECK ( sched.isDue (Time{2,0}));
CHECK (not sched.isMissed (Time{2,0}));
CHECK (not sched.isMissed (Time{3,0}));
CHECK ( sched.isMissed (Time{4,0}));
CHECK (not sched.isOutdated (Time{2,0}));
CHECK (not sched.isOutdated (Time{3,0}));
CHECK ( sched.isOutdated (Time{4,0}));
sched.feedPrioritisation (act, Time{1,0}, Time{3,0}, ManifestationID{5});
CHECK (Time(1,0) == sched.headTime());
CHECK ( sched.isOutdated (Time{1,0}));
CHECK (not sched.isMissed (Time{1,0}));
sched.activate (ManifestationID{5});
CHECK (Time(1,0) == sched.headTime());
CHECK ( sched.isDue (Time{1,0}));
CHECK (not sched.isOutdated (Time{1,0}));
CHECK (not sched.isOutdated (Time{3,0}));
CHECK ( sched.isOutdated (Time{4,0}));
CHECK ( sched.isMissed (Time{4,0}));
CHECK ( sched.isDue (Time{4,0}));
sched.drop (ManifestationID{5});
CHECK (Time(1,0) == sched.headTime());
CHECK ( sched.isOutdated (Time{1,0}));
CHECK ( sched.isOutdated (Time{4,0}));
CHECK ( sched.isMissed (Time{4,0}));
CHECK (not sched.isMissed (Time{1,0}));
CHECK ( sched.isDue (Time{1,0}));
sched.feedPrioritisation (act, Time{0,0}, Time{2,0}, ManifestationID{5}, true);
CHECK (Time(0,0) == sched.headTime()); // ^^^^ marked as compulsory
CHECK (not sched.isMissed (Time{1,0}));
CHECK ( sched.isOutdated (Time{1,0})); // marked as outdated since manifestation 5 is not activated
sched.activate (ManifestationID{5});
CHECK (not sched.isOutdated (Time{1,0}));
CHECK (not sched.isOutOfTime(Time{2,0})); // still OK /at/ deadline
CHECK ( sched.isOutOfTime(Time{3,0})); // ↯ past deadline yet marked as compulsory
CHECK ( sched.isOutdated (Time{3,0}));
CHECK ( sched.isMissed (Time{3,0}));
sched.drop (ManifestationID{5});
CHECK (Time(0,0) == sched.headTime());
CHECK ( sched.isOutdated (Time{1,0}));
CHECK (not sched.isOutOfTime(Time{2,0}));
CHECK (not sched.isOutOfTime(Time{3,0})); // the disabled manifestation masks the fatal out-of-time state
CHECK ( sched.isOutdated (Time{3,0}));
CHECK ( sched.isMissed (Time{3,0}));
sched.pullHead();
CHECK (Time(1,0) == sched.headTime());
CHECK ( sched.isOutdated (Time{1,0}));
CHECK ( sched.isDue (Time{1,0}));
sched.pullHead();
CHECK (Time(2,0) == sched.headTime());
CHECK (not sched.isOutdated (Time{2,0}));
CHECK ( sched.isOutdated (Time{4,0}));
CHECK ( sched.isMissed (Time{4,0}));
CHECK ( sched.isDue (Time{4,0}));
sched.pullHead();
CHECK (Time::NEVER == sched.headTime());
CHECK (not sched.isMissed (Time{4,0}));
CHECK (not sched.isOutdated (Time{4,0}));
CHECK (not sched.isDue (Time{4,0}));
CHECK (sched.empty());
}
};

View file

@ -79768,8 +79768,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node CREATED="1684980982361" ID="ID_1863198468" MODIFIED="1684980987321" TEXT="Themen">
<node CREATED="1684980991406" ID="ID_1812192430" MODIFIED="1684981025601" TEXT="Timings nachf&#xfc;hren">
<arrowlink COLOR="#705783" DESTINATION="ID_1565158605" ENDARROW="Default" ENDINCLINATION="223;-15;" ID="Arrow_ID_516157232" STARTARROW="None" STARTINCLINATION="372;51;"/>
<node CREATED="1684980991406" ID="ID_1812192430" MODIFIED="1698948793241" TEXT="Timings nachf&#xfc;hren">
<arrowlink COLOR="#705783" DESTINATION="ID_1565158605" ENDARROW="Default" ENDINCLINATION="360;-23;" ID="Arrow_ID_516157232" STARTARROW="None" STARTINCLINATION="372;51;"/>
</node>
</node>
</node>
@ -81981,12 +81981,26 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1697756690787" ID="ID_87589773" MODIFIED="1697756717299" TEXT="Design: delegierende &#xe4;u&#xdf;ere H&#xfc;lle"/>
<node CREATED="1698936372735" ID="ID_1811375699" MODIFIED="1698936389780" TEXT="Service-Access">
<node CREATED="1698936390960" ID="ID_31091241" MODIFIED="1698936407079" TEXT="separates Interface definieren">
<node CREATED="1698936390960" ID="ID_31091241" MODIFIED="1698945655354" TEXT="separates Interface definieren">
<linktarget COLOR="#ec2747" DESTINATION="ID_31091241" ENDARROW="Default" ENDINCLINATION="-130;11;" ID="Arrow_ID_215197651" SOURCE="ID_685418556" STARTARROW="None" STARTINCLINATION="5;-19;"/>
<node CREATED="1698937133797" ID="ID_609493132" MODIFIED="1698937141485" TEXT="scheduler-api.hpp">
<icon BUILTIN="info"/>
</node>
<node CREATED="1698937110289" ID="ID_1837336933" MODIFIED="1698937115982" TEXT="reduziert Header-Includes"/>
<node CREATED="1698937116771" ID="ID_231850405" MODIFIED="1698937120938" TEXT="verbessert Verst&#xe4;ndlichkeit"/>
<node BACKGROUND_COLOR="#e1d6c7" COLOR="#463227" CREATED="1698945910380" ID="ID_1122976270" MODIFIED="1698946107167" TEXT="Dom&#xe4;nen-Struktur zeigt sich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...und das hatte ich <i>an der Stelle </i>gar nicht erwartet: die tats&#228;chlichen Benutzer eines &#187;Scheduler-Service&#171; gehen nach wenigen festen Schemata vor und m&#252;ssen &#252;berhaupt nichts von einer &#187;Activity-Language&#171; wissen
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698937122167" ID="ID_4829396" MODIFIED="1698937490736" TEXT="kann dort Inteface-Typen definieren">
<icon BUILTIN="yes"/>
</node>
@ -82010,22 +82024,32 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697756746748" ID="ID_1029141907" MODIFIED="1697757702430" TEXT="Interface bauen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1697756762145" ID="ID_685418556" MODIFIED="1697756903799" TEXT="auf abstraktes Interface kann (vorerst) verzichtet werden">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697756762145" ID="ID_685418556" MODIFIED="1698945903762" TEXT="Service und Interface trennen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...bedingt durch den stark gegliederten Aufbau wird es auf Service-Ebene nichts zu verbergen geben &#8212; zudem bewegen sich voraussichtlich auch alle Clients im gleichen Code-Universums (so da&#223; es keine Probleme mit Dependencies gibt.
...der erhebliche techische Detailierungsgrad der &#252;bergreifenden Abl&#228;ufe legt eine klare Abtrennung zu den Kollaborationsparnern nahe. Zwar bewegen sich voraussichtlich auch alle Clients im gleichen Code-Universums (so da&#223; es keine Probleme mit Dependencies gibt), aber die <i>integration im Scheduler selber, </i>erweist sich bereits als herausfordernd komplex. Zudem zeichnet sich eine deutliche Abgrenzung im Sinne einer Dom&#228;ne heraus: die tats&#228;chlichen Clients m&#252;ssen praktisch nichts vom Themenkomplex der &#187;Activity-Language&#171; wissen.
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#ec2747" DESTINATION="ID_31091241" ENDARROW="Default" ENDINCLINATION="-130;11;" ID="Arrow_ID_215197651" STARTARROW="None" STARTINCLINATION="5;-19;"/>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697756908166" ID="ID_1142273023" MODIFIED="1697756948024" TEXT="Wrapper-Builder um den Activity-Term legen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697756956736" ID="ID_830267980" MODIFIED="1697756972566" TEXT="Top-level-Implementierung der Worker-Funktion">
<node COLOR="#338800" CREATED="1697756956736" ID="ID_830267980" MODIFIED="1698945554657" TEXT="Top-level-Implementierung der Worker-Funktion">
<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="#eee5c3" COLOR="#990000" CREATED="1697756908166" ID="ID_1142273023" MODIFIED="1698945492703" TEXT="Wrapper-Builder um den Activity-Term legen">
<icon BUILTIN="flag-yellow"/>
<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;"/>
<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>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697757025906" ID="ID_180161439" MODIFIED="1697757063868" TEXT="seedCalcStream()">
<icon BUILTIN="flag-yellow"/>
@ -82163,6 +82187,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1697808041495" ID="ID_492054934" MODIFIED="1698079204212" TEXT="die Work-Function zusammenstellen">
<linktarget COLOR="#7779a3" DESTINATION="ID_492054934" ENDARROW="Default" ENDINCLINATION="-814;62;" ID="Arrow_ID_817672667" SOURCE="ID_391492289" STARTARROW="None" STARTINCLINATION="1393;-112;"/>
<linktarget COLOR="#2f9552" DESTINATION="ID_492054934" ENDARROW="Default" ENDINCLINATION="-315;-355;" ID="Arrow_ID_1566437327" SOURCE="ID_830267980" STARTARROW="None" STARTINCLINATION="253;14;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1698004010478" ID="ID_1609383346" MODIFIED="1698009701573" TEXT="Schritte">
<icon BUILTIN="list"/>
@ -84113,9 +84138,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698875050812" ID="ID_292105591" MODIFIED="1698939255674" TEXT="Datenfelder">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1698877940667" ID="ID_1937246215" MODIFIED="1698877951763" TEXT="bl&#xe4;ht die Eintr&#xe4;ge auf">
<node COLOR="#338800" CREATED="1698875050812" ID="ID_292105591" MODIFIED="1698963531996" TEXT="Datenfelder">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698877940667" FOLDED="true" ID="ID_1937246215" MODIFIED="1698963527448" TEXT="bl&#xe4;ht die Eintr&#xe4;ge auf">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1698877955722" ID="ID_18567100" MODIFIED="1698878028037" TEXT="im Besonderen die bool-Flag ist Verschwendung pur">
<richcontent TYPE="NOTE"><html>
@ -84165,15 +84190,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="hourglass"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698933483810" ID="ID_1794722262" MODIFIED="1698933998545" TEXT="Deadline in &#xb5;-Ticks">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698933483810" ID="ID_1794722262" MODIFIED="1698963519573" TEXT="Deadline in &#xb5;-Ticks">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698933615025" ID="ID_1230994646" MODIFIED="1698933998544" TEXT="Significance">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698933622176" ID="ID_1319756279" MODIFIED="1698934006151" TEXT="Flags (Bit-Feld)">
<node COLOR="#338800" CREATED="1698933615025" ID="ID_1230994646" MODIFIED="1698963517800" TEXT="Significance">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1698933622176" ID="ID_1319756279" MODIFIED="1698963514291" TEXT="Flags (Bit-Feld)">
<node COLOR="#435e98" CREATED="1698935646594" ID="ID_1627815057" MODIFIED="1698935650825" TEXT="isCompulsory"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698933632934" ID="ID_1561119545" MODIFIED="1698934013070" TEXT="ManifestationID(32bit)">
<node COLOR="#435e98" CREATED="1698933632934" ID="ID_1561119545" MODIFIED="1698963516115" TEXT="ManifestationID(32bit)">
<linktarget COLOR="#894161" DESTINATION="ID_1561119545" ENDARROW="Default" ENDINCLINATION="-572;70;" ID="Arrow_ID_1358372763" SOURCE="ID_1074827633" STARTARROW="None" STARTINCLINATION="61;-315;"/>
<node CREATED="1698937181526" ID="ID_105164565" LINK="#ID_4829396" MODIFIED="1698937195213" TEXT="Datentyp in scheduler-API"/>
</node>
@ -84206,9 +84231,102 @@ 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="1698934459104" ID="ID_1030078999" MODIFIED="1698934566805" TEXT="SchedulerInvocaton_test erg&#xe4;nzen">
<arrowlink COLOR="#d6194f" DESTINATION="ID_774197123" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_644878733" STARTARROW="None" STARTINCLINATION="-1097;92;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698945154395" ID="ID_1664760512" MODIFIED="1698945168653" TEXT="erweiterte Pr&#xfc;fungen in die normale Verarbeitung integrieren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698945192477" ID="ID_1809715507" MODIFIED="1698945204897" TEXT="brauche nun zus&#xe4;tzliche Daten beim Einplanen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1698946253457" ID="ID_1811524315" MODIFIED="1698946256631" TEXT="Defaults">
<node CREATED="1698946293491" ID="ID_537001260" MODIFIED="1698946298907" TEXT="sinnvoll f&#xfc;r Tests"/>
<node CREATED="1698946300016" ID="ID_1426746639" MODIFIED="1698947331093" TEXT="Deadline auf &#xbb;Time::NEVER&#xab;">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<ul>
<li>
ein solcher Task w&#252;rde immer ausf&#252;hrbar bleiben und w&#228;re somit f&#252;r den Layer-1 neutral.
</li>
<li>
allerdings auf dem Scheduler-API mu&#223; die Deadline verpfichtend gemacht werden, denn sonst erstickt der Memory-Allocator irgendwann
</li>
</ul>
</body>
</html>
</richcontent>
</node>
<node CREATED="1698946311193" ID="ID_1622617686" MODIFIED="1698947426886" TEXT="leere ManifestationID">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
diese spezielle Marker-ID wird implizit stets freigeschaltet, kann also sp&#228;ter nicht verworfen werden; das erscheint mir ein sinnvoller Default
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1698946321096" ID="ID_1270673617" MODIFIED="1698947474211" TEXT="not isComplusory">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
verpflichtende Activities sind ebenfalls ein Feature, das eigentlich erst auf Scheduler-Level angesiedelt ist, und hier nur den entsprechenden Support braucht
</p>
</body>
</html>
</richcontent>
</node>
</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;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#338800" CREATED="1698946201921" ID="ID_1058086166" MODIFIED="1698963474934" TEXT="Informationsfunktionen erg&#xe4;nzen">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698946217933" ID="ID_1697537017" MODIFIED="1698946222845" TEXT="transparentes Verwerfen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1698948806933" ID="ID_420754882" MODIFIED="1698948813155" TEXT="wo ansetzen?">
<node CREATED="1698948815117" ID="ID_736157754" MODIFIED="1698948823278" TEXT="es mu&#xdf; eine Mutations-Funktion sein"/>
<node CREATED="1698948824058" ID="ID_42556043" MODIFIED="1698948833941" TEXT="sie mu&#xdf; stets unter Grooming-Token aufgerufen werden"/>
<node COLOR="#5b280f" CREATED="1698949109228" ID="ID_765027235" MODIFIED="1698949156519" TEXT="rein logisch w&#xe4;re feedPrioritisation() gut">
<icon BUILTIN="button_cancel"/>
<node CREATED="1698949125978" ID="ID_834884096" MODIFIED="1698949131126" TEXT="aber da fehlt die Zeitangabe"/>
<node CREATED="1698949131655" ID="ID_504965242" MODIFIED="1698949139964" TEXT="und es gibt zwei Aufruf-Variangen"/>
</node>
<node COLOR="#5b280f" CREATED="1698949142520" ID="ID_1038127597" MODIFIED="1698949156519" TEXT="damit bleibt nur noch pullHead &#xfc;brig">
<icon BUILTIN="button_cancel"/>
<node CREATED="1698949159126" ID="ID_1576956355" MODIFIED="1698949180743" TEXT="das ist aber definitiv nur eine low-level-Operation"/>
<node CREATED="1698949181235" ID="ID_655555656" MODIFIED="1698949192821" TEXT="und hat auch nicht die Zeit `now`"/>
<node CREATED="1698949193697" ID="ID_1153123389" MODIFIED="1698949214930" TEXT="au&#xdf;erdem w&#xe4;re die Formulierung if (isDue) untergraben"/>
</node>
<node CREATED="1698949216918" ID="ID_1626105170" MODIFIED="1698949234265">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
also geh&#246;rt diese Operation in <b>Layer-2</b>
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698934459104" ID="ID_1030078999" MODIFIED="1698963463139" TEXT="Scheduler Layer-Tests erg&#xe4;nzen">
<arrowlink COLOR="#1990d6" DESTINATION="ID_774197123" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_644878733" STARTARROW="None" STARTINCLINATION="-1097;92;"/>
<arrowlink COLOR="#d6194f" DESTINATION="ID_340948432" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_1678021866" STARTARROW="None" STARTINCLINATION="-1097;92;"/>
<icon BUILTIN="pencil"/>
</node>
</node>
</node>
@ -88144,8 +88262,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1684980732965" ID="ID_1914429002" MODIFIED="1684980742528" TEXT="Thema: Timing-Updates">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684980744406" ID="ID_1565158605" LINK="https://issues.lumiera.org/ticket/1302" MODIFIED="1684981025601" TEXT="#1302 maintain consistent job timings">
<linktarget COLOR="#705783" DESTINATION="ID_1565158605" ENDARROW="Default" ENDINCLINATION="223;-15;" ID="Arrow_ID_516157232" SOURCE="ID_1812192430" STARTARROW="None" STARTINCLINATION="372;51;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684980744406" ID="ID_1565158605" LINK="https://issues.lumiera.org/ticket/1302" MODIFIED="1698948793241" TEXT="#1302 maintain consistent job timings">
<linktarget COLOR="#705783" DESTINATION="ID_1565158605" ENDARROW="Default" ENDINCLINATION="360;-23;" ID="Arrow_ID_516157232" SOURCE="ID_1812192430" STARTARROW="None" STARTINCLINATION="372;51;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
@ -88829,9 +88947,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1697503841856" ID="ID_1434499377" LINK="#ID_1306162732" MODIFIED="1697509772561" TEXT="verify_WaterLevel">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698934474047" ID="ID_774197123" MODIFIED="1698934561661" TEXT="verify_Significance">
<linktarget COLOR="#d6194f" DESTINATION="ID_774197123" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_644878733" SOURCE="ID_1030078999" STARTARROW="None" STARTINCLINATION="-1097;92;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1698934474047" ID="ID_774197123" MODIFIED="1698963431837" TEXT="verify_Significance">
<linktarget COLOR="#1990d6" DESTINATION="ID_774197123" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_644878733" SOURCE="ID_1030078999" STARTARROW="None" STARTINCLINATION="-1097;92;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1698947582439" ID="ID_622394306" MODIFIED="1698963261235" TEXT="erweiterter Zustand per API sichtbar">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#435e98" CREATED="1698947635568" ID="ID_1195635801" MODIFIED="1698963396987" TEXT="API zum Freischalten/Verwerfen per ManifestationID"/>
<node COLOR="#435e98" CREATED="1698947694025" ID="ID_1628108286" MODIFIED="1698963412509" TEXT="obsoletes / nicht freigeschaltes Head erkennbar"/>
<node COLOR="#435e98" CREATED="1698947733092" ID="ID_1461678295" MODIFIED="1698963425188" TEXT="pr&#xfc;fen Compulsory-Verletzung auf Queue-Head"/>
</node>
<node COLOR="#338800" CREATED="1697509780561" ID="ID_858986653" MODIFIED="1697509782527" TEXT="verify_stability">
<icon BUILTIN="button_ok"/>
@ -88845,7 +88969,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1688336794355" FOLDED="true" ID="ID_1705923970" MODIFIED="1697674916927" TEXT="SchedulerCommutator_test">
<node COLOR="#338800" CREATED="1688336794355" ID="ID_1705923970" MODIFIED="1698963265645" TEXT="SchedulerCommutator_test">
<icon BUILTIN="button_ok"/>
<node CREATED="1688337141875" ID="ID_1442397948" MODIFIED="1697552361129" TEXT="&#xbb;Layer-2&#xab; : Activity execution">
<icon BUILTIN="info"/>
@ -89024,6 +89148,12 @@ 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="1698934474047" ID="ID_340948432" MODIFIED="1698963291724" TEXT="verify_Significance">
<linktarget COLOR="#d6194f" DESTINATION="ID_340948432" ENDARROW="Default" ENDINCLINATION="589;-82;" ID="Arrow_ID_1678021866" SOURCE="ID_1030078999" STARTARROW="None" STARTINCLINATION="-1097;92;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1698947608180" ID="ID_935784796" MODIFIED="1698947626950" TEXT="Queue-Processing verwirft abgelaufene Tasks"/>
<node CREATED="1698947694025" ID="ID_1869538175" MODIFIED="1698947727576" TEXT="nicht freigeschalte Manifestation wird unterdr&#xfc;ckt"/>
</node>
<node COLOR="#338800" CREATED="1697560546952" FOLDED="true" ID="ID_1326942653" MODIFIED="1697641948262" TEXT="verify_postDispatch">
<icon BUILTIN="button_ok"/>
<node CREATED="1697630618833" ID="ID_1032090324" MODIFIED="1697630748734" TEXT="Szenarien">