Scheduler: define expected behaviour for work retrieval

still not quite sure how to implement it,
but working down from first principles to define test scenarios first...
This commit is contained in:
Fischlurch 2023-10-18 02:59:58 +02:00
parent aa60869082
commit b57503fb97
4 changed files with 131 additions and 26 deletions

View file

@ -143,7 +143,7 @@ namespace gear {
Activity*
findWork (SchedulerInvocation& layer1)
findWork (SchedulerInvocation& layer1, Time now)
{
layer1.feedPrioritisation();
UNIMPLEMENTED("wtf??");

View file

@ -102,6 +102,13 @@ namespace gear {
, priority_{}
{ }
bool
empty() const
{
return instruct_.empty()
and priority_.empty();
}
/**
* Accept an Activity for time-bound execution

View file

@ -32,7 +32,7 @@
#include "lib/time/timevalue.hpp"
#include "lib/format-cout.hpp"
#include "lib/thread.hpp"
//#include "lib/util.hpp"
#include "lib/util.hpp"
#include "lib/test/diagnostic-output.hpp"///////////////////////////TODO TOD-Oh
//#include <utility>
@ -41,7 +41,7 @@
using test::Test;
using lib::test::threadBenchmark;
//using std::move;
//using util::isSameObject;
using util::isSameObject;
namespace vault{
@ -51,6 +51,10 @@ namespace test {
// using lib::time::FrameRate;
// using lib::time::Offset;
using lib::time::Time;
using std::atomic_bool;
using lib::ThreadHookable;
using std::unique_ptr;
using std::make_unique;
using std::this_thread::yield;
using std::this_thread::sleep_for;
using std::chrono_literals::operator ""us;
@ -178,9 +182,45 @@ namespace test {
atomic_bool stopTheHog_{false};
unique_ptr<ThreadHookable> groomingHog_;
using Launch = ThreadHookable::Launch;
/** @internal Helper to block the GroomingToken in another thread */
void
blockGroomingToken (SchedulerCommutator& sched)
{
REQUIRE (not groomingHog_);
if (sched.holdsGroomingToken(std::this_thread::get_id()))
sched.dropGroomingToken();
stopTheHog_ = false;
groomingHog_ = make_unique<ThreadHookable>(
Launch{[&]{
CHECK (sched.acquireGoomingToken());
do sleep_for (100us);
while (not stopTheHog_);
sched.dropGroomingToken();
}}
.atExit([&]{ groomingHog_.reset(); })
.threadID("grooming-hog"));
sleep_for (500us);
}
/** @internal stop the background thread to unblock the GrooingToken */
void
unblockGroomingToken()
{
stopTheHog_ = true;
while (groomingHog_)
yield();
}
/** @test TODO verify the decision logic where and when
* to perform the dispatch of an Scheduler Activity chain.
* @todo WIP 10/23 🔁 define implement
* @todo WIP 10/23 define implement
*/
void
verify_DispatchDecision()
@ -210,15 +250,7 @@ namespace test {
CHECK (not sched.decideDispatchNow (t3, now));
CHECK (not sched.holdsGroomingToken (myself));
std::atomic_bool stop{false};
lib::ThreadJoinable theHog{"grooming-hog"
, [&]{
CHECK (sched.acquireGoomingToken());
do sleep_for (100us);
while (not stop);
sched.dropGroomingToken();
}};
sleep_for (500us);
blockGroomingToken(sched);
CHECK (not sched.acquireGoomingToken());
CHECK (not sched.decideDispatchNow (t1, now));
@ -227,8 +259,7 @@ namespace test {
CHECK (not sched.decideDispatchNow (t2, now));
CHECK (not sched.holdsGroomingToken (myself));
stop = true;
theHog.join().maybeThrow();
unblockGroomingToken();
CHECK (sched.decideDispatchNow (t2, now));
CHECK (sched.holdsGroomingToken (myself));
@ -242,7 +273,51 @@ namespace test {
void
verify_findWork()
{
UNIMPLEMENTED ("findWork");
SchedulerInvocation queue;
SchedulerCommutator sched;
Time t1{10,0};
Time t2{20,0};
Time t3{30,0};
Time now{t2};
CHECK (not sched.findWork (queue, now)); // empty queue, no work found
Activity a1{1u,1u};
Activity a2{2u,2u};
Activity a3{3u,3u};
queue.instruct (a3, t3); // activity scheduled into the future
CHECK (not sched.findWork (queue, now)); // for time `now` not found
queue.instruct (a1, t1);
CHECK (isSameObject (a1, *sched.findWork(queue, now))); // but past activity is found
CHECK (not sched.findWork (queue, now)); // activity was retrieved
queue.instruct (a2, t2);
CHECK (isSameObject (a2, *sched.findWork(queue, now))); // activity scheduled for `now` is found
CHECK (not sched.findWork (queue, now));
CHECK (not queue.empty()); // yet the future activity a3 is still queued...
CHECK (isSameObject (a3, *sched.findWork(queue, t3))); // ...and will be found when querying "later"
CHECK (not sched.findWork (queue, t3));
CHECK ( queue.empty()); // Everything retrieved and queue really empty
queue.instruct (a2, t2);
queue.instruct (a1, t1);
CHECK (isSameObject (a1, *sched.findWork(queue, now))); // the earlier activity is found first
CHECK (isSameObject (a2, *sched.findWork(queue, now)));
CHECK (not sched.findWork (queue, now));
CHECK ( queue.empty());
queue.instruct (a2, t2); // prepare activity which /would/ be found...
blockGroomingToken(sched); // but prevent this thread from acquiring the GroomingToken
CHECK (not sched.findWork (queue, now)); // thus search aborts out immediately
CHECK (not queue.empty());
unblockGroomingToken(); // yet when we're able to get the GroomingToken
CHECK (isSameObject (a2, *sched.findWork(queue, now))); // the task can be retrieved
CHECK (queue.empty());
}

View file

@ -84891,7 +84891,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1687909561193" ID="ID_1235436372" MODIFIED="1688337610242" TEXT="GroomingToken">
<node COLOR="#338800" CREATED="1687909561193" ID="ID_1235436372" MODIFIED="1697585733751" TEXT="GroomingToken">
<icon BUILTIN="button_ok"/>
<node CREATED="1687909742256" ID="ID_768602373" MODIFIED="1687909749803" TEXT="implementiert per atomic CAS"/>
<node CREATED="1687909758046" ID="ID_1061447302" MODIFIED="1687909764595" TEXT="nur ein Worker kann es jeweils besitzen"/>
<node CREATED="1687909787970" ID="ID_1744353313" MODIFIED="1687909813720" TEXT="dieser bedient dann die Priority-Queue"/>
@ -84902,17 +84903,17 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#f95182" DESTINATION="ID_688462252" ENDARROW="Default" ENDINCLINATION="-17;60;" ID="Arrow_ID_1801176056" SOURCE="ID_1725190336" STARTARROW="None" STARTINCLINATION="-186;-6;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687909906855" ID="ID_195997630" MODIFIED="1697583958025" TEXT="Watchdog notwendig">
<linktarget COLOR="#71457a" DESTINATION="ID_195997630" ENDARROW="Default" ENDINCLINATION="-1608;190;" ID="Arrow_ID_345281595" SOURCE="ID_942157229" STARTARROW="None" STARTINCLINATION="-375;32;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687909906855" ID="ID_195997630" MODIFIED="1697585707021" TEXT="Watchdog notwendig">
<linktarget COLOR="#71457a" DESTINATION="ID_195997630" ENDARROW="Default" ENDINCLINATION="-1608;190;" ID="Arrow_ID_345281595" SOURCE="ID_942157229" STARTARROW="None" STARTINCLINATION="-385;28;"/>
<icon BUILTIN="bell"/>
<node CREATED="1687909963201" ID="ID_369489190" MODIFIED="1687909968365" TEXT="realisiert per Tick"/>
<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>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1694005255592" ID="ID_66203071" MODIFIED="1694005270787" TEXT="Fragen/Probleme">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1694005255592" ID="ID_66203071" MODIFIED="1697585717123" TEXT="Fragen/Probleme">
<icon BUILTIN="messagebox_warning"/>
<node COLOR="#435e98" CREATED="1694005273694" ID="ID_1381658042" MODIFIED="1694015491578" TEXT="sind dadurch die Inhalte in der Queue hinreichend synchronisiert?">
<node COLOR="#435e98" CREATED="1694005273694" FOLDED="true" ID="ID_1381658042" MODIFIED="1697585724925" TEXT="sind dadurch die Inhalte in der Queue hinreichend synchronisiert?">
<icon BUILTIN="help"/>
<node CREATED="1694005322415" ID="ID_786045876" MODIFIED="1694005335066" TEXT="also: wie viel &#xbb;barrier&#xab; brauchen wir?"/>
<node CREATED="1694009756545" ID="ID_1522114869" LINK="https://en.cppreference.com/w/cpp/atomic/atomic_thread_fence" MODIFIED="1694009810286" TEXT="hinreichend: eine std::atomic_thread_fence(release) + ein atomic_read"/>
@ -86249,9 +86250,31 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1697560511607" ID="ID_764686457" LINK="#ID_1453351337" MODIFIED="1697585897682" TEXT="verify_DispatchDecision">
<icon BUILTIN="button_ok"/>
<node CREATED="1697590592976" ID="ID_404768054" MODIFIED="1697590611320" TEXT="brauche bequeme L&#xf6;sung um das GroomingToken zu blocken">
<icon BUILTIN="yes"/>
</node>
<node COLOR="#5b280f" CREATED="1697590612637" ID="ID_1060454930" MODIFIED="1697590629155" TEXT="Manipulation einbauen">
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="button_cancel"/>
</node>
<node COLOR="#338800" CREATED="1697590630266" ID="ID_572620103" MODIFIED="1697590681454" TEXT="besser Hilfsfunktion die einen blocker-Thread verwaltet">
<linktarget COLOR="#90adb5" DESTINATION="ID_572620103" ENDARROW="Default" ENDINCLINATION="218;11;" ID="Arrow_ID_1616847265" SOURCE="ID_1685796091" STARTARROW="None" STARTINCLINATION="246;26;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1697560535930" ID="ID_849370574" MODIFIED="1697590666428" TEXT="verify_findWork">
<icon BUILTIN="pencil"/>
<node CREATED="1697585964522" ID="ID_1835507068" MODIFIED="1697585970582" TEXT="Szenarien">
<icon BUILTIN="list"/>
<node COLOR="#435e98" CREATED="1697586050195" ID="ID_1746743909" MODIFIED="1697587479840" TEXT="leere Queue &#x27f9; nix"/>
<node COLOR="#435e98" CREATED="1697586511110" ID="ID_985026796" MODIFIED="1697587481399" TEXT="zuk&#xfc;nftige Activity &#x27f9; nix"/>
<node COLOR="#435e98" CREATED="1697586546716" ID="ID_2405594" MODIFIED="1697587482327" TEXT="f&#xe4;llige Activity &#x27f9; gefunden"/>
<node COLOR="#435e98" CREATED="1697586590178" ID="ID_278111200" MODIFIED="1697587484628" TEXT="Activity schon in der Queue &#x27f9; gefunden"/>
<node COLOR="#435e98" CREATED="1697586605452" ID="ID_133472987" MODIFIED="1697590583834" TEXT="mehrere Activities &#x27f9; die &#xe4;lteste gefunden"/>
<node COLOR="#435e98" CREATED="1697586652526" ID="ID_1685796091" MODIFIED="1697590686734" TEXT="kein GroomingToken &#x27f9; nix">
<arrowlink COLOR="#90adb5" DESTINATION="ID_572620103" ENDARROW="Default" ENDINCLINATION="218;11;" ID="Arrow_ID_1616847265" STARTARROW="None" STARTINCLINATION="246;26;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697560535930" ID="ID_849370574" MODIFIED="1697560620825" TEXT="verify_findWork">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1697560546952" ID="ID_1326942653" MODIFIED="1697560620824" TEXT="verify_postDispatch">
<icon BUILTIN="flag-yellow"/>
@ -89292,8 +89315,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1692108511352" ID="ID_316055460" MODIFIED="1692108529978" TEXT="aber Ausnahme-Situationen sind an einen sehr spezifischen Kontext gebunden"/>
<node CREATED="1692108530641" ID="ID_991521612" MODIFIED="1692108564761" TEXT="die Stelle, die die Ausnahme erkennt, kennt i.d.R. diesen (=ihren eigenen) Kontext nicht"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1697583823705" ID="ID_942157229" MODIFIED="1697583958025" TEXT="Watchdog f&#xfc;r GroomingToken">
<arrowlink COLOR="#71457a" DESTINATION="ID_195997630" ENDARROW="Default" ENDINCLINATION="-1608;190;" ID="Arrow_ID_345281595" STARTARROW="None" STARTINCLINATION="-375;32;"/>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1697583823705" ID="ID_942157229" MODIFIED="1697585649174" TEXT="#1343 Watchdog f&#xfc;r GroomingToken">
<arrowlink COLOR="#71457a" DESTINATION="ID_195997630" ENDARROW="Default" ENDINCLINATION="-1608;190;" ID="Arrow_ID_345281595" STARTARROW="None" STARTINCLINATION="-385;28;"/>
<icon BUILTIN="hourglass"/>
</node>
</node>