Job-Planning: finally complete the MockSegmentation tests

Last testcase: add deeply nested Prerequisites.
Turns out that the allocator must be able to handle
re-entrant allocations, which std::deque can not fulfil.
Thus using std::list here for the Mock implementation.

In the end, the real allocations will be done by our custom
allocator (AllocationCluster), which can be arranged easily
to support re-entrant allocation calls (since the whole point
is to just place those objects into a pre-allocated large block
and only de-allocate them later in one sway. Thus the allocator
does not need to wait for the object constructor to finish, which
trivially allows for re-entrant calls)
This commit is contained in:
Fischlurch 2023-05-23 06:40:18 +02:00
parent 94cec423d0
commit 4f37b0412c
4 changed files with 314 additions and 157 deletions

View file

@ -151,7 +151,8 @@ using lib::LUID;
auto
getPrerequisites (uint slotNr =0) const
{
return lib::transformIterator (provision_[slotNr].requirements.begin()
return lib::transformIterator (this->empty()? Prerequisites::iterator()
: provision_[slotNr].requirements.begin()
,[](Prerequisite& prq) -> JobTicket const&
{
return prq.descriptor;

View file

@ -41,6 +41,7 @@
////#include "lib/format-cout.hpp"
#include "lib/diff/gen-node.hpp"
#include "lib/depend.hpp"
#include "lib/linked-elements.hpp"
#include "lib/itertools.hpp"
//#include "lib/iter-tree-explorer.hpp"
//#include "lib/util-coll.hpp"
@ -53,7 +54,8 @@
//#include <functional>
//#include <vector>
#include <tuple>
#include <deque>
#include <list>
//#include <deque>
//using test::Test;
//using util::isnil;
@ -82,7 +84,7 @@ namespace test {
// using play::Timings;
using lib::HashVal;
using std::make_tuple;
using std::deque;
// using std::deque;
///////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1294 : organisation of namespaces / includes??
using fixture::Segmentation;
@ -197,7 +199,9 @@ namespace test {
class MockSegmentation
: public Segmentation
{
std::deque<MockJobTicket> tickets_;
// simulated allocator;
// must be able to handle re-entrant allocations
std::list<MockJobTicket> tickets_;
public:
MockSegmentation()
@ -241,7 +245,7 @@ namespace test {
{
return tickets_.emplace_back (buildSeed(spec)
,buildPrerequisites(spec));
}
} // Warning: re-entrant invocation of emplace_back
};

View file

@ -26,28 +26,18 @@
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"
#include "steam/engine/mock-dispatcher.hpp"
#include "vault/engine/nop-job-functor.hpp"
#include "vault/engine/dummy-job.hpp"
#include "lib/iter-tree-explorer.hpp"
#include "lib/util-tuple.hpp"
#include "lib/util.hpp"
#include "lib/format-cout.hpp"
#include "lib/test/test-helper.hpp"
#include "lib/meta/duck-detector.hpp"///////////////TODO WIP
using test::Test;
///////////////////////////////////////////////////////TODO WIP for investigation
namespace lib {
namespace iter_explorer {
template<class RES>
using DecoTraits = _DecoratorTraits<RES>;
template<class SRC, class RES>
using ExpoTraits = _ExpanderTraits<SRC,RES>;
}}
///////////////////////////////////////////////////////TODO WIP for investigation
namespace steam {
namespace engine{
namespace test {
@ -58,41 +48,6 @@ namespace test {
using util::isSameObject;
using util::seqTuple;
///////////////////////////////////////////////////////TODO WIP for investigation
template<class U>
struct ReBind
{
using type = typename U::type;
};
// template<typename X, typename SEL = void>
// struct has_TypeResult : std::false_type { };
//
// template<typename X>
// struct has_TypeResult<X, typename ReBind<X>::type> : std::true_type { };
//
// template<typename X>
// struct has_TypeResult<X, typename X::Type> : std::true_type { };
// using lib::meta::Yes_t;
// using lib::meta::No_t;
//
// template<typename TY>
// class HasNested_type
// {
// template<class X>
// static Yes_t check(typename X::type *);
// template<class X>
// static Yes_t check(typename X::Type *);
// template<class>
// static No_t check(...);
//
// public:
// static const bool value = (sizeof(Yes_t)==sizeof(check<TY>(0)));
// };
//
// template<typename X>
// struct has_TypeResult : std::bool_constant<HasNested_type<X>::value> { };
///////////////////////////////////////////////////////TODO WIP for investigation
/**********************************************************************//**
@ -378,98 +333,42 @@ namespace test {
CHECK (23 == DummyJob::invocationAdditionalKey (job1));
CHECK (11 == DummyJob::invocationAdditionalKey (job2));
}
//-----------------------------------------------------------------/// deep nested prerequisite
//-----------------------------------------------------------------/// a tree of deep nested prerequisites
{
MockSegmentation mockSegs{MakeRec()
.attrib("mark", 11)
.scope(MakeRec()
.attrib("mark",23)
.genNode())
.attrib("mark", 11)
.scope(MakeRec()
.attrib("mark",33)
.scope(MakeRec()
.attrib("mark",55)
.genNode()
,MakeRec()
.attrib("mark",44)
.genNode()
)
.genNode()
,MakeRec()
.attrib("mark",22)
.genNode())
.genNode()};
using RTick = std::reference_wrapper<JobTicket>;
auto start = singleValIterator (mockSegs[Time::ZERO].jobTicket());
using SrC = lib::iter_explorer::BaseAdapter<lib::SingleValIter<engine::JobTicket const&> >;
auto bunny = [](JobTicket const& ticket)
auto it = lib::explore(start)
.expand ([](JobTicket const& ticket)
{
return ticket.getPrerequisites();
// return lib::transformIterator(ticket.getPrerequisites()
// ,[](JobTicket const& preq) -> JobTicket*
// { return unConst(&preq); }
// );
};
using ExIt = decltype(bunny(std::declval<JobTicket const&>()));
using Funny = std::function<ExIt(JobTicket const&)>;
Funny funny = bunny;
using ExpandedChildren = typename lib::iter_explorer::_FunTraits<Funny,SrC>::Res;
using ResIter = typename lib::iter_explorer::DecoTraits<ExpandedChildren>::SrcIter;
// lib::test::TypeDebugger<ResIter> buggy;
using ResIterVal = typename ResIter::value_type;
using SrcIterVal = typename SrC::value_type;
// lib::test::TypeDebugger<ResIterVal> buggy;
// lib::test::TypeDebugger<ExIt> bugggy;
using FunResTrait = lib::iter_explorer::_FunTraits<Funny,ResIter>;
using FunArg = typename FunResTrait::Arg;
using ArgAdaptRes = typename FunResTrait::ArgAdapter<ResIter>;
static_assert(std::is_convertible<typename ResIter::reference, FunArg>());
// lib::test::TypeDebugger<decltype(ArgAdaptRes::wrap(bunny))> buggy;
// using ResCore = iter_explorer::Expander<SRC, ExpandedChildren>;
using ResCore = lib::iter_explorer::Expander<SrC, ExpandedChildren>;
// using ExResIter = typename lib::iter_explorer::DecoTraits<ResCore>::SrcIter;
// static_assert(lib::meta::can_IterForEach<ResCore>::value);
// static_assert(lib::meta::can_STL_ForEach<ResCore>::value);
struct Murks
{
using type = void;
};
struct Gurks : Murks { };
static_assert(lib::meta::has_TypeResult<Gurks>());
using Wootz = std::common_type<JobTicket&, JobTicket const&>;
using Wauzz = typename Wootz::type;
// lib::test::TypeDebugger<Wauzz> bully;
static_assert(lib::meta::has_TypeResult<std::common_type<JobTicket*, void*>>());
// static_assert(HasNested_type<Gurks>::value);
// static_assert(HasNested_type<Wootz>::value);
// static_assert(has_TypeResult<Wootz>());
using ExiTrait = lib::iter_explorer::ExpoTraits<SrC, ExpandedChildren>;
using WrapIter = typename lib::iter_explorer::DecoTraits<ResCore>::SrcIter;
// lib::test::TypeDebugger<typename lib::meta::ValueTypeBinding<WrapIter>::reference> bully;
// static_assert(std::is_const_v<JobTicket const&>);
// static_assert(std::is_const_v<JobTicket const>);
// static_assert(std::is_const_v<JobTicket&&>);
// lib::test::TypeDebugger<std::common_type_t<JobTicket const, JobTicket const>> bully;
// lib::test::TypeDebugger<typename ExiTrait::CommonType> bully;
// lib::test::TypeDebugger<typename ExiTrait::reference> bully;
// lib::test::TypeDebugger<ResCore::reference> bully;
auto it = lib::explore(start)
// .transform ([](RTick t) -> JobTicket const&
// {
// return t.get();
// })
.expand (funny)
})
.expandAll()
.transform ([&](JobTicket const& ticket)
{
return ticket.createJobFor(coord).parameter.invoKey.part.a;
});
cout << util::join(it,"-") <<endl;
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1294
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1294
}
}
CHECK (util::join(it,"-") == "11-22-33-44-55"_expect);
} // Note: Prerequisites are prepended (LinkedElements)
} // thus at each level the last ones appear first
};

View file

@ -69803,22 +69803,22 @@
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681832844221" ID="ID_826966768" MODIFIED="1681832848268" TEXT="Aufbau">
<icon BUILTIN="pencil"/>
<node CREATED="1681832851795" ID="ID_1453467501" MODIFIED="1681832896408" TEXT="vom MockJobTicket aus beginnen...">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681832899812" ID="ID_1664606019" MODIFIED="1682047865205" TEXT="GenNode-basierter Implementierungs-Kern">
<node COLOR="#338800" CREATED="1681832899812" ID="ID_1664606019" MODIFIED="1684816357301" TEXT="GenNode-basierter Implementierungs-Kern">
<linktarget COLOR="#fef7d1" DESTINATION="ID_1664606019" ENDARROW="Default" ENDINCLINATION="139;-4;" ID="Arrow_ID_1184218305" SOURCE="ID_581175494" STARTARROW="None" STARTINCLINATION="13;150;"/>
<icon BUILTIN="pencil"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1681833031252" HGAP="29" ID="ID_1232985944" MODIFIED="1682953126289" TEXT="leer" VSHIFT="14">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1682205060282" ID="ID_290012620" MODIFIED="1683835350728" TEXT="mehrere Segmente">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681833034545" ID="ID_1378629902" MODIFIED="1681833049605" TEXT="rekursiv mit Prerequisite">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1681833034545" ID="ID_1378629902" MODIFIED="1684816356127" TEXT="rekursiv mit Prerequisite">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1682419270798" ID="ID_1327152864" MODIFIED="1682419278493" TEXT="#1294 prototype / mock fixture components">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1682419302874" ID="ID_1541946258" MODIFIED="1682419591486" TEXT="Den Knoten aufl&#xf6;sen &#x27f9; Prototyping">
<node COLOR="#435e98" CREATED="1682419302874" ID="ID_1541946258" MODIFIED="1684816351989" TEXT="Den Knoten aufl&#xf6;sen &#x27f9; Prototyping">
<richcontent TYPE="NOTE"><html>
<head>
@ -69950,8 +69950,8 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681833071385" ID="ID_1107925235" MODIFIED="1683722704189" TEXT="MockJob hinterlegen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1681833071385" ID="ID_1107925235" MODIFIED="1684816361001" TEXT="MockJob hinterlegen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1682036849793" ID="ID_1932533229" MODIFIED="1682047342244" TEXT="MockJob aufrufen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1682041035913" ID="ID_755113791" MODIFIED="1682047265222" TEXT="dann doch vielleicht besser den bestehenden DummyJob nehmen">
@ -69992,18 +69992,24 @@
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1682204997554" ID="ID_599701197" MODIFIED="1683837481941" TEXT="Prerequisites hinzuf&#xfc;gen">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1683836490113" ID="ID_1045524420" MODIFIED="1683837475432" TEXT="per rekursiver GenNode-Auswertung">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1682204997554" ID="ID_599701197" MODIFIED="1684815618152" TEXT="Prerequisites hinzuf&#xfc;gen">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683836490113" ID="ID_1045524420" MODIFIED="1684815616170" TEXT="per rekursiver GenNode-Auswertung">
<icon BUILTIN="button_ok"/>
<node CREATED="1684815623800" ID="ID_837898404" MODIFIED="1684815629260" TEXT="tendentiell gef&#xe4;hrlich"/>
<node CREATED="1684815629809" ID="ID_1444428" MODIFIED="1684815642939" TEXT="Erzeugung und Auswertung erfolgen ineinander verschachtelt"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1684815644310" ID="ID_1683688581" MODIFIED="1684816178878" STYLE="fork" TEXT="der Allokator mu&#xdf; re-entrant aufgerufen werden k&#xf6;nnen">
<arrowlink COLOR="#9f1b69" DESTINATION="ID_447348202" ENDARROW="Default" ENDINCLINATION="-766;-108;" ID="Arrow_ID_1594018198" STARTARROW="None" STARTINCLINATION="596;0;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683836500089" ID="ID_993440863" MODIFIED="1683845290600" TEXT="testen &#xfc;ber neues Interface getPrerequisites()">
</node>
<node COLOR="#338800" CREATED="1683836500089" ID="ID_993440863" MODIFIED="1684815606576" TEXT="testen &#xfc;ber neues Interface getPrerequisites()">
<arrowlink COLOR="#eb64a1" DESTINATION="ID_885444410" ENDARROW="Default" ENDINCLINATION="213;-1966;" ID="Arrow_ID_1011579074" STARTARROW="None" STARTINCLINATION="-384;23;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683897388982" ID="ID_1523682954" MODIFIED="1683897457247" TEXT="dabei M&#xf6;glichkeiten zur Pipeline-Verarbeitung ausloten">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683897388982" ID="ID_1523682954" MODIFIED="1684797093179" TEXT="dabei M&#xf6;glichkeiten zur Pipeline-Verarbeitung ausloten">
<linktarget COLOR="#dd399a" DESTINATION="ID_1523682954" ENDARROW="Default" ENDINCLINATION="-371;858;" ID="Arrow_ID_1803678506" SOURCE="ID_726660737" STARTARROW="None" STARTINCLINATION="267;-16;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1683897470433" ID="ID_293583902" MODIFIED="1683897488191" TEXT="ziemlich m&#xfc;hsam...">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1683897470433" FOLDED="true" ID="ID_293583902" MODIFIED="1684816340515" TEXT="ziemlich m&#xfc;hsam...">
<icon BUILTIN="smiley-angry"/>
<node COLOR="#ff0000" CREATED="1683897495069" ID="ID_668257697" MODIFIED="1683897532038" TEXT="Pipeline &#xfc;ber JobTicket&amp; gelingt &#xfc;berhaupt nicht">
<icon BUILTIN="broken-line"/>
@ -70089,7 +70095,7 @@
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
</node>
<node COLOR="#338800" CREATED="1683897959342" ID="ID_1569391939" MODIFIED="1684712476011" TEXT="Analyse">
<node COLOR="#338800" CREATED="1683897959342" FOLDED="true" ID="ID_1569391939" MODIFIED="1684712476011" TEXT="Analyse">
<icon BUILTIN="button_ok"/>
<node CREATED="1683897967984" ID="ID_98765669" MODIFIED="1684189289245" TEXT="der Pfad zur 1.Assertion ist dubios">
<richcontent TYPE="NOTE"><html>
@ -70212,18 +70218,18 @@
<node CREATED="1684192131373" ID="ID_724171201" MODIFIED="1684192159133" TEXT="Vorsicht: ich hatte die JobTicket::getPrerequisites auf -&gt; JobTicket const&amp; umgestellt">
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684192160287" ID="ID_1810931642" MODIFIED="1684192173402" TEXT="noch nicht klar inwiefern das zum eigentlichen Problem beitr&#xe4;gt">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#5b280f" CREATED="1684192160287" ID="ID_1810931642" MODIFIED="1684796998110" TEXT="tr&#xe4;gt aber nicht zum eigentlichen Problem bei">
<icon BUILTIN="button_cancel"/>
</node>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1684189641549" ID="ID_1940567504" MODIFIED="1684712468878" TEXT="Rekonstruktion">
<node COLOR="#338800" CREATED="1684189641549" FOLDED="true" ID="ID_1940567504" MODIFIED="1684712468878" TEXT="Rekonstruktion">
<icon BUILTIN="button_ok"/>
<node CREATED="1684189652118" ID="ID_1161273177" MODIFIED="1684189992174" TEXT="Teile des Call-Graphen explizit nachbauen">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1684189997712" ID="ID_770060385" MODIFIED="1684190017134" TEXT="Aufruf der expand()-Funktion">
<node COLOR="#435e98" CREATED="1684189997712" ID="ID_770060385" MODIFIED="1684796971056" TEXT="Aufruf der expand()-Funktion">
<icon BUILTIN="full-1"/>
<node CREATED="1684190290749" ID="ID_1560322036" MODIFIED="1684190302792" TEXT="Parameter sehen erst mal korrekt aus">
<richcontent TYPE="NOTE"><html>
@ -70299,7 +70305,7 @@
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684190367907" ID="ID_172958877" MODIFIED="1684193296301" TEXT="ResCore">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1684190367907" ID="ID_172958877" MODIFIED="1684796978191" TEXT="ResCore">
<icon BUILTIN="broken-line"/>
<node CREATED="1684193043318" ID="ID_1720124636" MODIFIED="1684193145322" TEXT="l&#xe4;&#xdf;t sich fehlerfrei konstruieren (&#xdc;berraschung)">
<icon BUILTIN="button_cancel"/>
@ -70465,7 +70471,7 @@
<linktarget COLOR="#a9b4c1" DESTINATION="ID_247789540" ENDARROW="Default" ENDINCLINATION="-15;-42;" ID="Arrow_ID_830127139" SOURCE="ID_672540161" STARTARROW="None" STARTINCLINATION="-53;2;"/>
<icon BUILTIN="forward"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1684718878713" ID="ID_741543772" MODIFIED="1684719029190" TEXT="Aber: rein-technisch kann es dabei zu Problemen kommen">
<arrowlink COLOR="#a0366c" DESTINATION="ID_368029592" ENDARROW="Default" ENDINCLINATION="-353;-1260;" ID="Arrow_ID_1815839573" STARTARROW="None" STARTINCLINATION="-394;19;"/>
<arrowlink COLOR="#4c3853" DESTINATION="ID_368029592" ENDARROW="Default" ENDINCLINATION="-353;-1260;" ID="Arrow_ID_1815839573" STARTARROW="None" STARTINCLINATION="-394;19;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1684718925338" ID="ID_917570391" MODIFIED="1684718961903" TEXT="&quot;Konversion&quot; kann man nur testen, indem man zuweist oder konstruiert"/>
@ -71260,8 +71266,8 @@
<node CREATED="1684712417420" ID="ID_991884799" MODIFIED="1684712439816" TEXT="nach &#xdc;berarbeitung und Verifikation der ValueTypeBindings sind alle Probleme verschwunden"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1684712494897" ID="ID_1651369451" MODIFIED="1684712520817" TEXT="nun die Pipeline auch noch mit Referenzen verwendbar machen">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1684712494897" FOLDED="true" ID="ID_1651369451" MODIFIED="1684797031174" TEXT="nun die Pipeline auch noch mit Referenzen verwendbar machen">
<icon BUILTIN="button_ok"/>
<node CREATED="1684714660497" ID="ID_216562837" MODIFIED="1684714672132" TEXT="mit JobTicket const&amp;"/>
<node COLOR="#435e98" CREATED="1684714672777" ID="ID_1009372749" MODIFIED="1684714888355" TEXT="Problem mit singleValIterator">
<icon BUILTIN="messagebox_warning"/>
@ -71344,7 +71350,7 @@
</node>
</node>
<node COLOR="#338800" CREATED="1684718826468" ID="ID_368029592" MODIFIED="1684796105008" TEXT="also doch: besserer Test f&#xfc;r &#xbb;kompatible Werte&#xab; gesucht">
<linktarget COLOR="#a0366c" DESTINATION="ID_368029592" ENDARROW="Default" ENDINCLINATION="-353;-1260;" ID="Arrow_ID_1815839573" SOURCE="ID_741543772" STARTARROW="None" STARTINCLINATION="-394;19;"/>
<linktarget COLOR="#4c3853" DESTINATION="ID_368029592" ENDARROW="Default" ENDINCLINATION="-353;-1260;" ID="Arrow_ID_1815839573" SOURCE="ID_741543772" STARTARROW="None" STARTINCLINATION="-394;19;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1684719111734" ID="ID_1888723433" MODIFIED="1684768943114" TEXT="explizit das &#xbb;can stand-in&#xab; pr&#xfc;fen">
<icon BUILTIN="idea"/>
@ -71521,6 +71527,253 @@
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1684797078432" ID="ID_1374445822" MODIFIED="1684797091083" TEXT="sehr aufwendiger Umbau in der Library notwendig">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1684800083638" ID="ID_214202588" MODIFIED="1684816199551" TEXT="mehrfach verschachtelte Prerequisites">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1684800102308" FOLDED="true" ID="ID_1545603358" MODIFIED="1684816327520" TEXT="SEGFAULT bzw. ung&#xfc;liges Ticket">
<icon BUILTIN="broken-line"/>
<node CREATED="1684800122544" ID="ID_1359955499" MODIFIED="1684800143035" TEXT="wie kann das passieren...?">
<font ITALIC="true" NAME="SansSerif" SIZE="9"/>
<icon BUILTIN="smiley-oh"/>
</node>
<node COLOR="#435e98" CREATED="1684800182479" ID="ID_1699865620" MODIFIED="1684809943355" TEXT="Untersuchung">
<icon BUILTIN="info"/>
<node COLOR="#435e98" CREATED="1684800281091" ID="ID_888424202" MODIFIED="1684800984773" TEXT="getPrerequisites() auf offensichtlich leeres JobTIcket">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1684800326022" ID="ID_1067024943" MODIFIED="1684800358078" TEXT="Problem ist der Zugriff &#xfc;ber die Channel-Nummer als index">
<icon BUILTIN="info"/>
</node>
<node COLOR="#338800" CREATED="1684800304904" ID="ID_1087272387" MODIFIED="1684800982186" TEXT="hier fehlt wohl ein empty()-Check">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1684800990944" ID="ID_761480756" MODIFIED="1684801006632" TEXT="damit ist der SEGFAULT weg">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1684800373071" ID="ID_1430831381" MODIFIED="1684809869554" TEXT="aber wie kann ein leeres JobTicket hier auftreten?">
<icon BUILTIN="help"/>
<node CREATED="1684801562142" ID="ID_1605790902" MODIFIED="1684801578488" TEXT="...zwar ist das mit den Referenzen schon gef&#xe4;hrlich"/>
<node CREATED="1684801579316" ID="ID_372682624" MODIFIED="1684801596281" TEXT="...aber alle JobTickets sollten doch stabil im Speicher liegen"/>
<node CREATED="1684801485968" ID="ID_913020779" MODIFIED="1684801598211" TEXT="das Ticket liegt schon kaputt in der Segmentation">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1684801502795" ID="ID_1960449243" MODIFIED="1684808093527" TEXT="Problem tritt nur auf, wenn auf einer Ebene mehrere Prerequisites stehen">
<arrowlink DESTINATION="ID_949912580" ENDARROW="Default" ENDINCLINATION="6;-58;" ID="Arrow_ID_1790481096" STARTARROW="None" STARTINCLINATION="-130;5;"/>
<icon BUILTIN="idea"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1684804513055" ID="ID_949912580" MODIFIED="1684809865284" TEXT="Builder-Iteration beobachten">
<linktarget COLOR="#a9b4c1" DESTINATION="ID_949912580" ENDARROW="Default" ENDINCLINATION="6;-58;" ID="Arrow_ID_1790481096" SOURCE="ID_1960449243" STARTARROW="None" STARTINCLINATION="-130;5;"/>
<icon BUILTIN="list"/>
<node CREATED="1684804523586" ID="ID_1608815995" MODIFIED="1684804540156" TEXT="die zwei nested-Tickets (23 und 55) werden korrekt erzeugt"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1684804540768" ID="ID_1851251656" MODIFIED="1684806148264" TEXT="das top-level-Ticket ist unvollst&#xe4;ndig konstruiert oder korrumpiert">
<icon BUILTIN="broken-line"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1684806150056" ID="ID_1647779785" MODIFIED="1684806202639" TEXT="es findet eine Verwechslung statt">
<icon BUILTIN="clanbomber"/>
</node>
<node CREATED="1684806158743" ID="ID_1548270265" MODIFIED="1684806194070" TEXT="zwischen dem top-Level Ticket(id=11) und dem 2.Subticket(id=55)"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1684807049319" ID="ID_1694835244" MODIFIED="1684807993087" TEXT="Deque::emplace_back wird re-entrant aufgerufen">
<icon BUILTIN="broken-line"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1684808026054" ID="ID_295426763" MODIFIED="1684809879076" TEXT="wie kommt es zu dem re-entranten Aufruf?">
<icon BUILTIN="help"/>
<node CREATED="1684808108715" ID="ID_1801096639" MODIFIED="1684808131299" TEXT="dem Job-Ticket-ctor wird (eingepackt) nur ein Iterator f&#xfc;r die Prerequisites &#xfc;bergeben"/>
<node CREATED="1684808232459" ID="ID_1237322436" MODIFIED="1684808257034" TEXT="tats&#xe4;chlich ist das ein TransformIterator (welcher JobTicket baut)">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1684808150430" ID="ID_52443343" MODIFIED="1684808175181" TEXT="w&#xe4;hrend wir via emplace_back im top-Level ctor sind..."/>
<node CREATED="1684809408905" ID="ID_85213934" MODIFIED="1684809444816" TEXT="..wird zun&#xe4;chst die Spec ausgewertet">
<linktarget COLOR="#ff005c" DESTINATION="ID_85213934" ENDARROW="Default" ENDINCLINATION="44;42;" ID="Arrow_ID_1089227137" SOURCE="ID_324096076" STARTARROW="None" STARTINCLINATION="-159;8;"/>
</node>
<node CREATED="1684808175873" ID="ID_1817247393" MODIFIED="1684809424673" TEXT="...und dabei wird dieser Iterator aktiviert">
<node CREATED="1684809243689" ID="ID_577633189" MODIFIED="1684809255515" TEXT="ruft den transform-Funktor auf"/>
<node CREATED="1684809255935" ID="ID_687227041" MODIFIED="1684809279464" TEXT="dieser ruft re-entrant das emplace_back auf"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1684809282899" ID="ID_711686740" MODIFIED="1684809315951" TEXT="dieses belegt this mit einer bereits vergebenen Adresse">
<icon BUILTIN="clanbomber"/>
</node>
<node CREATED="1684809321046" ID="ID_546438489" MODIFIED="1684809327413" TEXT="und wertet dann die Spec aus"/>
<node CREATED="1684809328621" ID="ID_312188745" MODIFIED="1684809377598" TEXT="wegen der RVO arbeitet provisionSpec bereits im doppelt belegten Speicher">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1684809386287" ID="ID_324096076" MODIFIED="1684809462569">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
und <b>korrumpiert</b>&#160;daher die laufende Berechnung auf top-Level
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#ff005c" DESTINATION="ID_85213934" ENDARROW="Default" ENDINCLINATION="44;42;" ID="Arrow_ID_1089227137" STARTARROW="None" STARTINCLINATION="-159;8;"/>
</node>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1684809928901" ID="ID_1559101169" MODIFIED="1684815403687" TEXT="die re-entranten Aufrufe vermeiden">
<icon BUILTIN="button_ok"/>
<node CREATED="1684809953633" ID="ID_1013476722" MODIFIED="1684809961752" TEXT="strukturelles Problem">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1684809963208" ID="ID_197980826" MODIFIED="1684810145770">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Prerequisites sind <b>privat</b>&#160;in JobTicket
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684809974582" ID="ID_1124553578" MODIFIED="1684810053666">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
deshalb <i>k&#246;nnen sie erst</i>&#160;im Konstruktor gebaut werden
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684810016680" ID="ID_440066044" MODIFIED="1684810138446">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
au&#223;erdem gibt es <b>kein Mutatons-API</b>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684810031506" ID="ID_20132995" MODIFIED="1684810066790">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
also <i>m&#252;ssen sie auch bereits</i>&#160;im Konstruktor vollst&#228;ndig gebaut werden
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684810092358" ID="ID_642183288" MODIFIED="1684810132046">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
und obendrein ist JobTicket <b>non-Copyable</b>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1684810104699" ID="ID_1982427509" MODIFIED="1684810125912">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
also <i>mu&#223; es per emplace</i>&#160;erzeugt werden
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1684811237684" ID="ID_1491313298" MODIFIED="1684815110975" TEXT="m&#xf6;gliche Auswege">
<icon BUILTIN="idea"/>
<node CREATED="1684811252562" ID="ID_1210649344" MODIFIED="1684815247084" TEXT="re-entrante Allokationen erm&#xf6;glichen">
<linktarget COLOR="#fef9d2" DESTINATION="ID_1210649344" ENDARROW="Default" ENDINCLINATION="-151;0;" ID="Arrow_ID_315568490" SOURCE="ID_95686416" STARTARROW="None" STARTINCLINATION="-105;-6;"/>
<icon BUILTIN="forward"/>
</node>
<node CREATED="1684811272864" ID="ID_977069915" MODIFIED="1684815243367" TEXT="die Prerequisite-Tickets bereits vor dem ctor-Aufruf bauen">
<icon BUILTIN="button_cancel"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1684815113734" HGAP="10" ID="ID_447348202" MODIFIED="1684816189525" TEXT="Entscheidung" VSHIFT="7">
<linktarget COLOR="#9f1b69" DESTINATION="ID_447348202" ENDARROW="Default" ENDINCLINATION="-766;-108;" ID="Arrow_ID_1594018198" SOURCE="ID_1683688581" STARTARROW="None" STARTINCLINATION="596;0;"/>
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1684815119061" ID="ID_66677317" MODIFIED="1684815145555" TEXT="ich erwarte re-entrante Allokationen">
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1684815148892" ID="ID_95686416" MODIFIED="1684815385171">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Entscheidung im Hinblick auf den <b>AllocationCluster</b>
</p>
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
das kommt nicht von Ungef&#228;hr: dieses ganze (relativ fragile) Setup mit den Referenzen in LinkedElements mache ich ganz bewu&#223;t, weil am Ende ein Allocation-Schema beabsichtigt ist, bei dem viele Elemente in kurzer Zeit in einen gemeinsam allozierten gro&#223;en Block gelegt werden; dort bleiben sie bestehen, selbst nachdem ihr Destruktor aufgerufen wurde. Die De-Allokation erfolgt auf einmal, zusammen mit dem gesamten Segment
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#fef9d2" DESTINATION="ID_1210649344" ENDARROW="Default" ENDINCLINATION="-151;0;" ID="Arrow_ID_315568490" STARTARROW="None" STARTINCLINATION="-105;-6;"/>
<icon BUILTIN="info"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1684815414062" HGAP="-19" ID="ID_836227530" MODIFIED="1684815438692" TEXT="Mock-Implementierung: simuliere den Allokator durch std::list" VSHIFT="25">
<icon BUILTIN="idea"/>
<node CREATED="1684815440034" ID="ID_1890084327" MODIFIED="1684815464820">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
das ist eine <i>&#187;bastel-L&#246;sung&#171;</i>
</p>
</body>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1684815466385" ID="ID_578127251" MODIFIED="1684816314080" TEXT="rein pragmatisch herausgefunden">
<icon BUILTIN="info"/>
<node CREATED="1684815474222" ID="ID_1145733613" MODIFIED="1684816258000" TEXT="deque::emplace_back &#xd83e;&#xdc32; Korruption"/>
<node CREATED="1684816258635" ID="ID_347170626" MODIFIED="1684816287085" TEXT="list::emplace_front &#xd83e;&#xdc32; letztes Element ersetzt alle anderen"/>
<node CREATED="1684816287811" ID="ID_1223921866" MODIFIED="1684816309202">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
list::emplace_back&#160;&#160;<b><font color="#0d8c6a">funktioniert</font></b>
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1684816203960" ID="ID_1218889309" MODIFIED="1684816218544" TEXT="komplexer Testfall mit mehrfach geschachtelten Prerequisites">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>