Chain-Load: draft usage for Scheduler testing

- use a dedicated context "dropped off" the TestChainLoad instance
- encode the node-idx into the InvocationInstanceID
- build an invocation- and a planning-job-functor
- let planning progress over an lib::UninitialisedStorage array
- plant the ActivityTerm instances into that array as Scheduling progresses
This commit is contained in:
Fischlurch 2023-12-03 23:33:06 +01:00
parent c5679b0fd0
commit e0766f2262
13 changed files with 524 additions and 35 deletions

View file

@ -148,7 +148,7 @@ namespace lib {
Symbol& operator= (Symbol &&) = default;
explicit operator bool() const { return not empty(); }
bool empty() const { return *this == BOTTOM; }
bool empty() const { return *this == BOTTOM or *this == EMPTY; }
size_t
length() const

View file

@ -76,7 +76,7 @@ namespace time {
virtual TimeValue timeOf (FSecs gridTime, int=0) const =0;
};
typedef std::shared_ptr<const Grid> PGrid;
using PGrid = std::shared_ptr<const Grid>;

View file

@ -252,6 +252,7 @@ namespace time {
/** predefined constant for PAL framerate */
const FrameRate FrameRate::PAL (25);
const FrameRate FrameRate::NTSC (30000,1001);
const FrameRate FrameRate::STEP (1);
const FrameRate FrameRate::HALTED (1,std::numeric_limits<int>::max());

View file

@ -679,6 +679,7 @@ namespace time {
static const FrameRate PAL;
static const FrameRate NTSC;
static const FrameRate STEP; ///< 1 frame per second
static const FrameRate HALTED;

View file

@ -88,7 +88,7 @@ namespace meta {
{
PGrid gridImplementation = AssetManager::instance().wrap (newGrid);
PQuant quantiser (dynamic_pointer_cast<const Quantiser>(gridImplementation));
Literal bindingID (cStr(newGrid.ident.name));
Literal bindingID (cStr(newGrid.ident.name)); //////////////TODO 2023 shouldn't that be a lib::Symbol?
advice::Provision<PGrid>(bindingID).setAdvice(gridImplementation);
advice::Provision<PQuant>(bindingID).setAdvice(quantiser);
@ -157,16 +157,23 @@ namespace meta {
}
GridID nameID (id);
return publishWrapped (*new SimpleTimeGrid(origin, fps, nameID));
// build new Meta-Asset, registered with AssetManager, and publish into Advice-System
return publishWrapped (*new SimpleTimeGrid(origin, fps, nameID)); ///////////////////////////TICKET #840 currently this replaces an existing Registration. What do we actually want here?
}
/* === TimeGrid shortcut builder functions === */
PGrid
TimeGrid::build (Symbol gridID, FrameRate frames_per_second)
TimeGrid::build (FrameRate frames_per_second) ///< automatically generates a generic grid name
{
return build (gridID,frames_per_second, Time(0,0));
return build (Symbol::EMPTY,frames_per_second);
}
PGrid
TimeGrid::build (Symbol gridID, FrameRate frames_per_second) ///< grid origin is at Time::ZERO
{
return build (gridID,frames_per_second, Time::ZERO);
}

View file

@ -90,6 +90,7 @@ namespace meta {
public:
/* === shortcut builder functions === */
static PGrid build (FrameRate frames_per_second);
static PGrid build (Symbol gridID, FrameRate frames_per_second);
static PGrid build (Symbol gridID, FrameRate frames_per_second, Time origin);

View file

@ -105,11 +105,11 @@ namespace test{
void
checkTimecodeUsageCycle ()
{
string quellCode = generateRandomFrameNr();
PQuant refScale = Quantiser::retrieve("pal0");
string srcCode = generateRandomFrameNr();
PQuant refScale = Quantiser::retrieve("pal0");
// get internal (raw) time value
TimeValue t1 = format::Frames::parse(quellCode, *refScale);
TimeValue t1 = format::Frames::parse (srcCode, *refScale);
ENSURE (0 != t1);
// manipulating
@ -134,8 +134,8 @@ namespace test{
q2.accept (Mutation::changeTime(v1));
CHECK (30 == q2.formatAs<Frames>() - frames1); // q2 == v1 == t1 + (6*5)/(5*5)sec
CHECK (quellCode == string(frames1));
CHECK (quellCode != string(frames2));
CHECK (srcCode == string(frames1));
CHECK (srcCode != string(frames2));
showTimeCode (frames1);
showTimeCode (frames2);

View file

@ -94,7 +94,7 @@ namespace test{
int n = count; // frame count, accessible as plain number
CHECK (Time(FSecs(n-1, 25)) <= org); // verify quantisation: the original time
CHECK (org < Time(FSecs(n+1, 25))); // is properly bracketed by (n-1, n+2)
CHECK (org < Time(FSecs(n+1, 25))); // is properly bracketed by (n-1, n+1)
}

View file

@ -116,7 +116,7 @@ namespace test {
void
createGrid_simplified()
{
PGrid simplePALGrid = TimeGrid::build ("", FrameRate::PAL);
PGrid simplePALGrid = TimeGrid::build (FrameRate::PAL);
CHECK (simplePALGrid);
CHECK (!util::isnil (simplePALGrid->ident.name)); // note: name-ID filled in automatically
cout << "simple PAL Grid: " << simplePALGrid->ident << endl;

View file

@ -47,12 +47,16 @@ namespace lib {
namespace test{
/******************************************************//**
* @test properties of Symbol data type. Currently this is
* just a thin wrapper for a const char *
* @todo this test is very much WIP, as the implementation
* of a real symbol type and symbol table remains
* to be done. ///////////////////////////Ticket #157
/***********************************************************//**
* @test properties of Literal and Symbol data types.
* - a lib::Literal is just a thin wrapper for a `const char *`
* - lib::Symbol uses the same implementation, but relies on
* character string constants _interned_ into a symbol table.
* @todo 2023 this test is very much in preliminary shape, as the
* implementation of a real symbol table remains was lacking.
* At some point, a simplistic implementation of »interned strings«
* was added (TICKET #157) yet still the actual relevance of
* unique Symbols remains nebulous
*/
class Symbol_test : public Test
{
@ -133,6 +137,17 @@ namespace test{
CHECK (sy3.c() == Symbol{""}.c());
CHECK (Symbol{}.c() == Symbol{""}.c());
// EMPTY and BOTTOM are distinct Symbols, yet both count as "empty"
CHECK (Symbol::EMPTY == Symbol{""});
CHECK (Symbol::BOTTOM == Symbol{""});
CHECK (Symbol::EMPTY != Symbol::BOTTOM);
CHECK (Symbol{nullptr} == Symbol::BOTTOM);
CHECK (Symbol::EMPTY.empty());
CHECK (Symbol::BOTTOM.empty());
CHECK (not Symbol::FAILURE.empty());
CHECK (isnil (Symbol{""}));
CHECK (isnil (Symbol{""}));
// re-assignment
sy3 = Symbol{l1};
CHECK (!isnil(sy3));

View file

@ -30,10 +30,12 @@
#include "test-chain-load.hpp"
//#include "vault/real-clock.hpp"
//#include "lib/time/timevalue.hpp"
#include "vault/gear/job.h"
#include "lib/format-cout.hpp" ////////////////////////////////////TODO Moo-oh
#include "lib/test/diagnostic-output.hpp"//////////////////////////TODO TOD-oh
#include "lib/util.hpp"
#include <array>
//using lib::time::Time;
//using lib::time::FSecs;
@ -42,6 +44,7 @@ using util::isnil;
using util::isSameObject;
//using lib::test::randStr;
//using lib::test::randTime;
using std::array;
namespace vault{
@ -82,8 +85,7 @@ namespace test {
showcase_PruneChains();
showcase_StablePattern();
verify_reseed_recalculate();
witch_gate();
verify_scheduling_setup();
}
@ -927,13 +929,58 @@ namespace test {
/** @test TODO diagnostic blah
* @todo WIP 11/23 🔁 define implement
/** @test TODO setup for running a chain-load as scheduled task
* - running an isolated Node recalculation
* - dispatch of this recalculation packaged as render job
*
* @todo WIP 12/23 🔁 define implement
*/
void
witch_gate()
verify_scheduling_setup()
{
UNIMPLEMENTED ("witch gate");
array<Node,4> nodes;
auto& [s,p1,p2,e] = nodes;
s.addSucc(p1)
.addSucc(p2);
e.addPred(p1)
.addPred(p2);
s.level = 0;
p1.level = p2.level = 1;
e.level = 2;
CHECK (e.hash == 0);
for (Node& n : nodes)
n.calculate();
CHECK (e.hash == 0x6A5924BA3389D7C);
// now do the same invoked as »render job«
for (Node& n : nodes)
n.hash = 0;
s.level = 0;
p1.level = 1;
p2.level = 1;
e.level = 2;
RandomChainCalcFunctor<32,16> chainJob{nodes[0]};
Job job0{chainJob
,chainJob.encodeNodeID(0)
,chainJob.encodeLevel(0)};
Job job1{chainJob
,chainJob.encodeNodeID(1)
,chainJob.encodeLevel(1)};
Job job2{chainJob
,chainJob.encodeNodeID(2)
,chainJob.encodeLevel(1)};
Job job3{chainJob
,chainJob.encodeNodeID(3)
,chainJob.encodeLevel(2)};
CHECK (e.hash == 0);
job0.triggerJob();
job2.triggerJob();
job1.triggerJob();
job3.triggerJob();
CHECK (e.hash == 0x6A5924BA3389D7C);
}
};

View file

@ -83,13 +83,14 @@
#include "vault/common.hpp"
#include "lib/test/transiently.hpp"
//#include "vault/gear/job.h"
#include "vault/gear/job.h"
//#include "vault/gear/activity.hpp"
//#include "vault/gear/nop-job-functor.hpp"
//#include "lib/time/timevalue.hpp"
#include "vault/gear/nop-job-functor.hpp"
#include "lib/time/timevalue.hpp"
//#include "lib/meta/variadic-helper.hpp"
//#include "lib/meta/function.hpp"
//#include "lib/wrapper.hpp"
#include "lib/time/quantiser.hpp"
#include "lib/iter-explorer.hpp"
#include "lib/format-string.hpp"
#include "lib/format-cout.hpp"
@ -115,7 +116,7 @@ namespace test {
using std::string;
// using std::function;
// using lib::time::TimeValue;
// using lib::time::Time;
using lib::time::Time;
// using lib::time::FSecs;
// using lib::time::Offset;
// using lib::meta::RebindVariadic;
@ -995,5 +996,54 @@ namespace test {
/* ========= Render Job generation and Scheduling ========= */
template<size_t numNodes, size_t maxFan>
class RandomChainCalcFunctor
: public NopJobFunctor
{
using Node = typename TestChainLoad<numNodes,maxFan>::Node;
public:
RandomChainCalcFunctor(Node& startNode)
{ }
/** rigged special implementation of job invocation
*/
void
invokeJobOperation (JobParameter param) override
{
UNIMPLEMENTED ("unpack parameters and dispatch into TestChainLoad-Node");
}
string diagnostic() const override
{
return "ChainCalc-TODoh";
}
/** package the node-index to invoke.
* @note per convention for this test, this info will be
* packaged into the lower word of the InvocationInstanceID
*/
static auto
encodeNodeID (size_t idx)
{
InvocationInstanceID invoKey;
invoKey.code.w1 = idx;
return invoKey;
};
static Time
encodeLevel (size_t level)
{
UNIMPLEMENTED ("setup a FixedFrameQuantiser with 1FPS");
}
};
}}} // namespace vault::gear::test
#endif /*VAULT_GEAR_TEST_TEST_CHAIN_LOAD_H*/

View file

@ -79709,7 +79709,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681086220019" ID="ID_1372752844" MODIFIED="1681086232986" TEXT="Umbau: C-Struct - Layer zur&#xfc;ckbauen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681951421768" ID="ID_283868393" MODIFIED="1681951528212" TEXT="Schrittweiser Umbau: alte C-Struct vorw&#xe4;rts-kompatibel machen">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681951421768" ID="ID_283868393" MODIFIED="1687555435111" TEXT="Schrittweiser Umbau: alte C-Struct vorw&#xe4;rts-kompatibel machen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -79718,13 +79718,88 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<icon BUILTIN="flag-yellow"/>
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1681951529483" ID="ID_737477406" MODIFIED="1681951551777" TEXT="JobFunctor &#x2023; JobClosure">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node CREATED="1681086385917" ID="ID_1193213661" MODIFIED="1681086416077" TEXT="leichtgewichtig, kopierbar, stateful, Scheduler-impl-owned"/>
<node CREATED="1701486985336" ID="ID_651799474" MODIFIED="1701486990571" TEXT="Eigenschaften">
<node CREATED="1681086385917" ID="ID_1193213661" MODIFIED="1701487006678" TEXT="leichtgewichtig, kopierbar, stateful, Scheduler-impl-owned">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1701486993815" ID="ID_391790753" MODIFIED="1701486999993" TEXT="Struktur der Argumente">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1701487016324" ID="ID_1155865731" MODIFIED="1701487021931" TEXT="Diskussion...?">
<icon BUILTIN="help"/>
<node CREATED="1701487039849" ID="ID_616254801" MODIFIED="1701487064754" TEXT="Bedeutung der Argumente k&#xf6;nnte teilweise vom konkreten Funktor abh&#xe4;ngig sein"/>
<node CREATED="1701487125231" ID="ID_802893295" MODIFIED="1701487151022" TEXT="nominal Time : mu&#xdf; ganz sicher downstream per Grid &#xfc;bersetzt werden"/>
<node CREATED="1701487219433" ID="ID_1120029380" MODIFIED="1701487242906" TEXT="einige Argumente stellen eigentlich Parametrisierung eines generischen Funktors dar"/>
<node CREATED="1701487268101" ID="ID_1972068234" MODIFIED="1701487296471" TEXT="Argumente sind sinnvoll, wenn sie f&#xfc;r jeden Frame verschieden sind"/>
<node CREATED="1701487308645" ID="ID_53693227" MODIFIED="1701487328511">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
&#10233; man <i>k&#246;nnte </i>Argumente <b>encodieren</b>
</p>
</body>
</html></richcontent>
<node CREATED="1701487334353" ID="ID_1667403852" MODIFIED="1701487363785" TEXT="per Trampolin in den JobFunctor-Ptr"/>
<node CREATED="1701487366693" ID="ID_617390332" MODIFIED="1701487406662" TEXT="per Argument-Key und zus&#xe4;tzlichen Translator"/>
<node COLOR="#435e98" CREATED="1701487464472" ID="ID_1097042622" MODIFIED="1701488082699" TEXT="sinnvoll? jetzt??">
<icon BUILTIN="help"/>
<node CREATED="1701487765040" ID="ID_923220489" MODIFIED="1701488074852" TEXT="pro: Flexibilit&#xe4;t und Entlastung des Schedulers">
<icon BUILTIN="button_cancel"/>
<node CREATED="1701487783573" ID="ID_1648655157" MODIFIED="1701487798783" TEXT="wir m&#xfc;ssen uns noch gar nicht festlegen, was f&#xfc;r Parameter ben&#xf6;tigt werden"/>
<node CREATED="1701487799578" ID="ID_1146543607" MODIFIED="1701487808541" TEXT="der Eintrag im Scheduler wird minimal"/>
<node CREATED="1701487818132" ID="ID_131470790" MODIFIED="1701487823068" TEXT="Job-Records werden kleiner"/>
</node>
<node CREATED="1701487490580" ID="ID_1625842672" MODIFIED="1701488080660" TEXT="contra: zus&#xe4;tzlicher Translator mu&#xdf; verwaltet werden">
<icon BUILTIN="forward"/>
<node CREATED="1701487507562" ID="ID_1031276443" MODIFIED="1701487516629" TEXT="er ist an den jeweiligen Play-Prozess gebunden"/>
<node CREATED="1701487517371" ID="ID_953946343" MODIFIED="1701487530000" TEXT="er mu&#xdf; vom Play-Prozess global eingerichetet werden"/>
<node CREATED="1701487539561" ID="ID_18561883" MODIFIED="1701487546642" TEXT="das greift der Segmentierung vor"/>
<node CREATED="1701487590639" ID="ID_839764786" MODIFIED="1701487655403" TEXT="und stellt weitere Zustands-Abh&#xe4;ngigkeit her">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
denn damit w&#228;re nicht nur die Segmentation zu erhalten, sondern auch der Play-Prozess-Translator-Record &#8212; solange bis kein Job mehr &#8222;anrufen&#8220; kann
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1701487872384" ID="ID_1962954801" MODIFIED="1701488080660" TEXT="contra: die Activity-Language dient dem gleichen Zweck">
<icon BUILTIN="forward"/>
<node CREATED="1701487928425" ID="ID_285184109" MODIFIED="1701487942292" TEXT="sie wird nach Pattern f&#xfc;r den Einzelfall instantiiert"/>
<node CREATED="1701487942999" ID="ID_1482535151" MODIFIED="1701487957458" TEXT="hierf&#xfc;r ist das Lebensdauer-Problem bereits gel&#xf6;st"/>
<node CREATED="1701488048121" ID="ID_1514178646" MODIFIED="1701488057788" TEXT="Speicher daf&#xfc;r ist bereits gepoolt und sehr effizient"/>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1701488083545" ID="ID_709873359" MODIFIED="1701488114912">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<u>Fazit</u>: nein und YAGNI
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
<node CREATED="1701488124767" ID="ID_248451009" MODIFIED="1701488140529" TEXT="zun&#xe4;chst einmal wird alles durch die bestehenden Strukturen durchgef&#xe4;delt"/>
<node CREATED="1701488141161" ID="ID_97207661" MODIFIED="1701488156591" TEXT="sollte das &#xbb;knapp&#xab; werden, dann wird die Activity-Language erweitert"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685802625130" ID="ID_1442656492" MODIFIED="1688601316599" TEXT="Job-Daten-Record">
<linktarget COLOR="#fe3665" DESTINATION="ID_1442656492" ENDARROW="Default" ENDINCLINATION="-1161;156;" ID="Arrow_ID_1073485120" SOURCE="ID_148642807" STARTARROW="None" STARTINCLINATION="-478;30;"/>
<icon BUILTIN="flag-yellow"/>
@ -79751,7 +79826,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#3e3f9b" DESTINATION="ID_1078372838" ENDARROW="Default" ENDINCLINATION="426;-58;" ID="Arrow_ID_1700206774" SOURCE="ID_491497133" STARTARROW="None" STARTINCLINATION="311;19;"/>
<linktarget COLOR="#4b3ea5" DESTINATION="ID_1078372838" ENDARROW="Default" ENDINCLINATION="416;-39;" ID="Arrow_ID_209843242" SOURCE="ID_953619048" STARTARROW="None" STARTINCLINATION="669;36;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1688600921177" ID="ID_1002134574" MODIFIED="1688600925684" TEXT="size_t strcArg"/>
<node CREATED="1688600921177" ID="ID_1002134574" MODIFIED="1688600925684" TEXT="size_t srcArg"/>
<node CREATED="1688600926480" ID="ID_57908906" MODIFIED="1688600930635" TEXT="size_t sinkArg"/>
</node>
</node>
@ -100268,6 +100343,298 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1700105555476" ID="ID_587761135" MODIFIED="1700105558876" TEXT="Scheduling">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701488317653" ID="ID_502099140" MODIFIED="1701488325489" TEXT="Art der Integration festlegen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1701488246119" ID="ID_518382795" LINK="#ID_53693227" MODIFIED="1701488287933" TEXT="Bezug zur &#xbb;Encodierung von Job-Argumenten&#xab;">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701490186822" ID="ID_658348473" MODIFIED="1701490206342" TEXT="#1295 job invocation parameter representation">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1701490209941" ID="ID_231328088" MODIFIED="1701490257231">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<u>Stand</u>: noch nicht vollt&#228;ndig umgesetzt
</p>
</body>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1701490218212" ID="ID_1089368654" MODIFIED="1701490230246" TEXT="nur der Invocation-Key ist durchgeschleift"/>
<node COLOR="#5b280f" CREATED="1701490295354" ID="ID_1201168729" MODIFIED="1701490335283" TEXT="das JobFunctor-Interface akzeptiert keine zus&#xe4;tzlichen Argumente">
<icon BUILTIN="stop-sign"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1701490276188" ID="ID_1180825392" MODIFIED="1701490340494" TEXT="die 2.Feed-Activity ist derzeit leer">
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1701490637565" ID="ID_96958310" MODIFIED="1701490654507" TEXT="jetzt implementieren &#x2014; oder weiter durchmogeln?">
<icon BUILTIN="help"/>
<node CREATED="1701490659833" ID="ID_148739202" MODIFIED="1701490679838" TEXT="erwarte, da&#xdf; sich das Thema r&#xfc;ckw&#xe4;rts von der &#xbb;Node-Invocation&#xab; her kl&#xe4;rt">
<icon BUILTIN="info"/>
</node>
<node CREATED="1701490692653" ID="ID_67997206" MODIFIED="1701490757553" TEXT="alle bisherigen Tests packen die Verifikations-Payload in die InvocationInstanceID">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node CREATED="1701488366430" ID="ID_1676473919" MODIFIED="1701488373146" TEXT="Steuerung des Zugriffs">
<node CREATED="1701488374014" ID="ID_923328966" MODIFIED="1701488576222">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
f&#252;r den eigentlichen Aufruf gen&#252;gt ein <font face="Monospaced" color="#5c0e8a">Node*</font>
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1701488555309" ID="ID_251594057" MODIFIED="1701488573238" TEXT="der Funktor braucht aber eine typisierte Closure">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1701488579450" ID="ID_635811261" MODIFIED="1701488668523" TEXT="er mu&#xdf; n&#xe4;mlich das Mem-Layout von &#xbb;Node&#xab; kennen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
....und das h&#228;ngt vom Template-Parameter der TestChainLoad ab (<font face="Monospaced" color="#6c2f31">size_t maxFan</font>)
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1701490404883" ID="ID_16635541" MODIFIED="1701491037626" TEXT="L&#xf6;sung-1 : Funktor wird vom Template instantiiert">
<icon BUILTIN="forward"/>
<node CREATED="1701490482569" ID="ID_1203111511" MODIFIED="1701490505573" TEXT="leicht umzusetzen"/>
<node COLOR="#435e98" CREATED="1701491027233" ID="ID_673787747" MODIFIED="1701491031709" TEXT="KISS">
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#5b280f" CREATED="1701490421209" ID="ID_1638819074" MODIFIED="1701491039410" TEXT="L&#xf6;sung-2 : Funktor bekommt vom Template einen Dispatcher">
<icon BUILTIN="button_cancel"/>
<node COLOR="#5b280f" CREATED="1701490491080" ID="ID_1785819549" MODIFIED="1701491024562" TEXT="enstpricht mehr der Realit&#xe4;t">
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1701490990894" ID="ID_1939179952" MODIFIED="1701491019860" TEXT="welcher Realit&#xe4;t??">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
wei&#223; ja noch nicht, wie das f&#252;r ProcNode implementiert wird
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1701490522375" ID="ID_661863679" MODIFIED="1701490537754" TEXT="es gibt keinen offensichtlichen Zeit-Bezug">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1701490556823" ID="ID_1224574723" MODIFIED="1701490575134" TEXT="die Nodes sollten nach Layer-Ordnung behandelt werden"/>
<node CREATED="1701490603497" ID="ID_1528195432" MODIFIED="1701490623330" TEXT="&#x27f9; bedeutet: aus der Zeit l&#xe4;&#xdf;t sich nicht die Node rekonstruieren"/>
<node CREATED="1701490811846" ID="ID_1106508882" MODIFIED="1701490839795">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
formal-Logisch entspr&#228;che der Node-Index dem <b><font face="Monospaced">srcRef</font></b>-Parameter
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1701491082441" ID="ID_1432085773" MODIFIED="1701491087154" TEXT="Beschlu&#xdf;">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="yes"/>
<node CREATED="1701491091978" ID="ID_1343223831" MODIFIED="1701491104906" TEXT="der Funktor wird vom Template &#xbb;abgeworfen&#xab;"/>
<node CREATED="1701491138047" ID="ID_477283179" MODIFIED="1701491146374" TEXT="(der mu&#xdf; dann irgendwo residieren, z.B. im Stack-Frame)"/>
<node CREATED="1701491105567" ID="ID_2955492" MODIFIED="1701491137114" TEXT="man &#xfc;bergibt direkt einen Pointer darauf"/>
<node CREATED="1701491172165" ID="ID_1453790989" MODIFIED="1701491203414" TEXT="die Level-Nummer wird direkt in die nominelle Zeit codiert">
<node CREATED="1701491207249" ID="ID_227520102" MODIFIED="1701491214620" TEXT="wie ist im Grunde egal">
<node CREATED="1701644765955" ID="ID_207437696" MODIFIED="1701644774457" TEXT="verwende eine FixedFrameQuantiser"/>
<node CREATED="1701644775597" ID="ID_1517631819" MODIFIED="1701644789319" TEXT="mit einer Frame-Rate &#x2254; 1"/>
<node CREATED="1701644790211" ID="ID_859085781" MODIFIED="1701644813586" TEXT="komplett per Helper-Funktionen verbergen"/>
</node>
<node CREATED="1701491215288" ID="ID_1770681095" MODIFIED="1701491225971" TEXT="beim Aufruf wird mit der Level-Nr der Node verglichen"/>
<node CREATED="1701491226535" ID="ID_42032084" MODIFIED="1701491234169" TEXT="Exception oder abort wenn das nicht pa&#xdf;t"/>
<node CREATED="1701491238819" ID="ID_1658586813" MODIFIED="1701491248533" TEXT="ansonsten wird diese Info nicht weiter ausgewertet"/>
</node>
<node CREATED="1701491256794" ID="ID_228896368" MODIFIED="1701491275468" TEXT="den Node-Index verstecken wir in der InvocationInstanceID">
<node CREATED="1701491280767" ID="ID_1555411889" MODIFIED="1701491286834" TEXT="das ist eine tempor&#xe4;re L&#xf6;sung"/>
<node CREATED="1701491287412" ID="ID_1202131618" MODIFIED="1701491299894" TEXT="sp&#xe4;ter zieht diese Info in den srcRef-Parameter um"/>
</node>
<node CREATED="1701644821415" ID="ID_819606175" MODIFIED="1701644833217" TEXT="die &#xdc;bersetzung wird komplett in Helper-Funktionen verborgen"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701492130949" ID="ID_675763294" MODIFIED="1701493055702" TEXT="Abl&#xe4;ufe zum Aufruf">
<icon BUILTIN="info"/>
<node CREATED="1701492140931" ID="ID_1320296040" MODIFIED="1701492145760" TEXT="Szenario vorbereiten">
<node CREATED="1701492296608" ID="ID_704886543" MODIFIED="1701492301635" TEXT="Topologie generieren"/>
<node CREATED="1701492304278" ID="ID_822112283" MODIFIED="1701492623100" TEXT="Lastparameter festlegen">
<arrowlink COLOR="#46417d" DESTINATION="ID_600666367" ENDARROW="Default" ENDINCLINATION="-77;5;" ID="Arrow_ID_1576743155" STARTARROW="None" STARTINCLINATION="79;9;"/>
</node>
<node CREATED="1701492317525" ID="ID_1881487168" MODIFIED="1701492327879" TEXT="Job-Funktoren generieren">
<node CREATED="1701492328779" ID="ID_1288799048" MODIFIED="1701492334727" TEXT="Meta-Job">
<node CREATED="1701492400282" ID="ID_1328828871" MODIFIED="1701492406517" TEXT="kennt den Dispatcher-Job"/>
<node CREATED="1701492408312" ID="ID_7980137" MODIFIED="1701492432032" TEXT="wei&#xdf; die Zahl zu erzeugender Level"/>
<node CREATED="1701492498750" ID="ID_600666367" MODIFIED="1701492616979" TEXT="kennt ein Mapping Level-Nr &#x27fc; dispatch-Zeit">
<linktarget COLOR="#46417d" DESTINATION="ID_600666367" ENDARROW="Default" ENDINCLINATION="-77;5;" ID="Arrow_ID_1576743155" SOURCE="ID_822112283" STARTARROW="None" STARTINCLINATION="79;9;"/>
<node CREATED="1701492530640" ID="ID_189764840" MODIFIED="1701492537823" TEXT="beachte: nur Dispatch-Zeit"/>
<node CREATED="1701492538439" ID="ID_1396963090" MODIFIED="1701492582067" TEXT="hier geht es nicht um eine &#xbb;Gesamt-Simulation&#xab;">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
also nicht um den gesamten Playback-Proze&#223;. Es m&#252;ssen keinerlei Deadline-Planungen gemacht werden; das kommt alles Fix per Test-Setup
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1701492433029" ID="ID_1524195763" MODIFIED="1701492496433" TEXT="geht per Level oder per Job-Nummer vor...">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
das k&#246;nnten Varianten des Test-Setup sein; wei&#223; noch nicht was hier gebraucht wird. Rein intuitiv w&#252;rde ich erst mal nur nach dem Level vorgehen
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1701492666350" ID="ID_1408515925" MODIFIED="1701492703698" TEXT="bekommt demnach die Level-Nr als einziges Job-Argument">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
das pa&#223;t doch hervorragend; LevelNr &#8801; nominal time
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1701492335301" ID="ID_761185060" MODIFIED="1701492340856" TEXT="Dispatcher-Job">
<node CREATED="1701492358918" ID="ID_1718078211" MODIFIED="1701492373658" TEXT="dieser enth&#xe4;lt einen direkten Backpointer zum TestChainLoad"/>
<node CREATED="1701492384572" ID="ID_1043264129" MODIFIED="1701492395574" TEXT="der Rest kommt &#xfc;ber die Job-Argumente"/>
</node>
</node>
</node>
<node CREATED="1701492148715" ID="ID_351519805" MODIFIED="1701492176651" TEXT="Meta-Job absetzen">
<node CREATED="1701492233368" ID="ID_1590497556" MODIFIED="1701492262376" TEXT="dieser verwendet die TestChainLoad, um zu dispatchen"/>
<node CREATED="1701492263484" ID="ID_907709182" MODIFIED="1701492290404" TEXT="hier geeignete Continuation-Closure vorsehen"/>
</node>
<node CREATED="1701492216738" ID="ID_70908232" MODIFIED="1701492227198" TEXT="auf Vollzugs-Notification warten">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1701492802252" ID="ID_462409370" MODIFIED="1701492809108" TEXT="woher kommt die? wer macht die?">
<icon BUILTIN="help"/>
<node CREATED="1701492811689" ID="ID_1542455064" MODIFIED="1701492825844" TEXT="wir starten hier keine Threads">
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1701492828257" ID="ID_1372403993" MODIFIED="1701492835845" TEXT="also kann es nur aus dem Meta-Job kommen"/>
<node CREATED="1701492899063" ID="ID_261543502" MODIFIED="1701492907570" TEXT="der k&#xf6;nnte eine Closure ausf&#xfc;hren oder eine Flag setzen"/>
</node>
<node CREATED="1701492932866" ID="ID_331874903" MODIFIED="1701548899190" TEXT="man k&#xf6;nnte hier fest ein wait()-notify() codieren">
<node CREATED="1701492951352" ID="ID_599266710" MODIFIED="1701492962514" TEXT="d.h. der Schedule()-Aufruf..."/>
<node CREATED="1701492963126" ID="ID_1362334556" MODIFIED="1701492969265" TEXT="w&#xfc;rde den Meta-Job absetzen"/>
<node CREATED="1701492969853" ID="ID_354060729" MODIFIED="1701492985848" TEXT="und danach in ein thread:;wait() gehen"/>
<node CREATED="1701492990299" ID="ID_999473580" MODIFIED="1701492995350" TEXT="ggfs sogar mit Timeout()!"/>
<node CREATED="1701493003512" ID="ID_436816851" MODIFIED="1701493015501" TEXT="die Closure aus dem Meta-Job weckt uns dann wieder auf"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701488306399" ID="ID_437847189" MODIFIED="1701488325489" TEXT="Schinttstelle bestimmen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701493065993" ID="ID_1474617887" MODIFIED="1701493070377" TEXT="Implementierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701548966576" ID="ID_1078499413" MODIFIED="1701548984371" TEXT="Basis und Rahmen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701549002234" ID="ID_1561610431" MODIFIED="1701550109050" TEXT="Design-Fragen zu kl&#xe4;ren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1701550180973" ID="ID_809373895" MODIFIED="1701630273510" TEXT="wie verarbeiten wir Prerequisites?">
<icon BUILTIN="help"/>
<node CREATED="1701550315571" ID="ID_1778692014" MODIFIED="1701550322317" TEXT="Activity-Term-API">
<node CREATED="1701550323615" ID="ID_7308108" MODIFIED="1701550333725" TEXT="wir brauchen f&#xfc;r beide einen ActivityTerm"/>
<node CREATED="1701550335856" ID="ID_264099658" MODIFIED="1701550359743" TEXT="wir gehen von der Prerequisite und h&#xe4;ngen sie an den Nachfolger"/>
</node>
<node CREATED="1701550473011" ID="ID_1870816803" MODIFIED="1701550487721" TEXT="SchedulerSpec">
<node CREATED="1701550488596" ID="ID_1839210683" MODIFIED="1701550497481" TEXT="packt den ActivityTerm ein"/>
<node CREATED="1701550497932" ID="ID_1574659542" MODIFIED="1701550504262" TEXT="Scheduler gibt uns nur diese"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701550504897" ID="ID_1986125239" MODIFIED="1701550524073" TEXT="dort ein API zum Anh&#xe4;ngen von Prerequisites schaffen">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1701550571574" ID="ID_903982829" MODIFIED="1701550580028" TEXT="Nodes verweisen per direktem Pointer aufeinander">
<node CREATED="1701550583145" ID="ID_1111982200" MODIFIED="1701550593585" TEXT="damit hat man nur eine andere Node in der Hand"/>
<node CREATED="1701550594381" ID="ID_1100224733" MODIFIED="1701550628201" TEXT="brauche Hilfe vom TestChainLoad &#x27fc; NodeID herausfinden"/>
<node CREATED="1701550669625" ID="ID_318100058" MODIFIED="1701550690108" TEXT="&#x27f9; SchedulerSpec m&#xfc;ssen auch in einem Array liegen"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1701550796338" ID="ID_10603052" MODIFIED="1701550944298" TEXT="SchedulerSpec (und ActivityTerm) passen nicht gut in dieses Arbeitsschema">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1701550947518" ID="ID_844132583" MODIFIED="1701550954585" TEXT="die waren als Builder gedacht"/>
<node CREATED="1701630020156" ID="ID_1451722632" MODIFIED="1701630029914" TEXT="und damit auf eine Einzelfall-Anwendung zugeschnitten"/>
<node CREATED="1701630030692" ID="ID_1766960147" MODIFIED="1701630048493" TEXT="nun haben wir es mit schematischer Massen-Verarbeitung zu tun"/>
<node CREATED="1701574628934" ID="ID_12588074" MODIFIED="1701574720900" TEXT="mit einem UninitialisedStorage-Array k&#xf6;nnte es besser gehen">
<arrowlink COLOR="#5b92bc" DESTINATION="ID_1331044905" ENDARROW="Default" ENDINCLINATION="-1107;79;" ID="Arrow_ID_1234105866" STARTARROW="None" STARTINCLINATION="-2546;116;"/>
</node>
</node>
<node CREATED="1701630108121" ID="ID_466850642" MODIFIED="1701630276535" TEXT="Vorteil (nur) hier: Prerequisites liegen stetes genau einen Level tiefer">
<icon BUILTIN="idea"/>
<node CREATED="1701630162426" ID="ID_1752012941" MODIFIED="1701630171933" TEXT="systematischer Verarbeitung Level f&#xfc;r Level"/>
<node CREATED="1701630172579" ID="ID_665479593" MODIFIED="1701630209464" TEXT="die Vorg&#xe4;nger-Terme liegen lassen"/>
<node CREATED="1701630235800" ID="ID_112345737" MODIFIED="1701630388553" TEXT="Test-Setup kann man ausn&#xfc;tzen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
wir wissen, da&#223; es keine concurrent Aufrufe geben wird, und auch Allokation stellt kein Problem dar; wir k&#246;nnen einfach State im &#187;Test-Rahmen&#171; liegen lassen
</p>
</body>
</html>
</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1701550085813" ID="ID_1532623231" MODIFIED="1701630291290" TEXT="wie greift der Meta-Job auf den Schedulerer zu?">
<icon BUILTIN="help"/>
<node CREATED="1701630398320" ID="ID_519354189" MODIFIED="1701630417244" TEXT="der reale Meta-Planer-Job wird &#xfc;ber einen Scheduler-Service (DI) gehen"/>
<node CREATED="1701630418928" ID="ID_456698721" MODIFIED="1701630480580" TEXT="das w&#xfc;rde aber das Test-Setup verkomplizieren und behindern"/>
</node>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1701630880013" ID="ID_1011967668" MODIFIED="1701630892763" TEXT="es ist ein kontrolliertes Test-Setup">
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
<node CREATED="1701630907866" ID="ID_1372628167" MODIFIED="1701630912378" TEXT="Platz spielt keine Rolle"/>
<node CREATED="1701630913014" ID="ID_1412800501" MODIFIED="1701630921358" TEXT="es l&#xe4;uft nicht concurrent"/>
<node CREATED="1701630922141" ID="ID_887329209" MODIFIED="1701630929224" TEXT="explizitie Vorbereitung m&#xf6;glich"/>
<node CREATED="1701634155541" ID="ID_237095519" MODIFIED="1701634175327" TEXT="daf&#xfc;r m&#xf6;glichst generisch und klar"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701493082582" ID="ID_1894179968" MODIFIED="1701493117170" TEXT="Dispatcher-Job implementieren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701493075903" ID="ID_114421309" MODIFIED="1701493117170" TEXT="Meta-Job implementieren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1701493107387" ID="ID_1826192324" MODIFIED="1701493117170" TEXT="Aufruf-front-End">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
</node>
@ -110762,8 +111129,7 @@ class Something
Da alignof(char) &#8801; 1, ist es gradezu eine &#187;Steilvorlage&#171; f&#252;r Probleme, wenn man einen Allocation-Buffer per char[] deklariert. GCC macht das nicht (er f&#228;ngt Allokationen immer an 64bit-Grenzen an), aber grunds&#228;tzlich d&#252;rfte ein Compiler ein char[] anfangen, wo er grad' lustig ist. Besonders gef&#228;hrlich, wenn das Array <i>in ein anderes Objekt eingebettet</i>&#160;wird. Nur den zuletzt genannten Fall habe ich 2019 abgekl&#228;rt; gegen alle sonstigen <i>Schnaps-Ideen </i>gibt es keinen Schutz &#8212; es sei denn, man h&#228;lt sich an die Sprachmittel
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1701556228394" ID="ID_1444144444" LINK="https://en.cppreference.com/w/cpp/types/aligned_storage" MODIFIED="1701559705550" TEXT="es g&#xe4;be daf&#xfc;r ein Sprachmittel: std::aligned_storage">
<node CREATED="1701556795662" ID="ID_1263844060" LINK="https://stackoverflow.com/a/71828512" MODIFIED="1701556817727" TEXT="wenngleich auch deprecated f&#xfc;r C++23"/>
@ -110775,6 +111141,7 @@ class Something
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1701559745027" ID="ID_1331044905" MODIFIED="1701574720900" TEXT="lib::UninitialisedStorage bereitstellen">
<linktarget COLOR="#5b92bc" DESTINATION="ID_1331044905" ENDARROW="Default" ENDINCLINATION="-1107;79;" ID="Arrow_ID_1234105866" SOURCE="ID_12588074" STARTARROW="None" STARTINCLINATION="-2546;116;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1701561920506" ID="ID_889775258" MODIFIED="1701561928182" TEXT="&#x27f6; und f&#xfc;r ExtentFamilty verwenden">
<icon BUILTIN="button_ok"/>