Dispatcher-Pipeline: solve allocation of JobTicket instances

...by defining a new scheme for access to custom allocators
...and then passing a reference to such an accessor into the
   JobTicket ctor, thereby allowing the ticket istelf recursively
   to place further JobTicket instances into the allocation space

--> success, test passes (finally)
This commit is contained in:
Fischlurch 2023-06-11 04:37:38 +02:00
parent f25ec2f5ef
commit b18e79d077
7 changed files with 396 additions and 56 deletions

View file

@ -34,6 +34,8 @@
#include "lib/util.hpp"
#include "lib/sync.hpp"
#include <deque>
using util::isnil;
@ -66,7 +68,7 @@ namespace lib {
class AllocationCluster::MemoryManager
: public Sync<RecursiveLock_NoWait>
{
typedef std::vector<char*> MemTable;
typedef std::deque<char*> MemTable;
TypeInfo type_;
MemTable mem_;
size_t top_; ///< index of the next slot available for allocation

View file

@ -0,0 +1,94 @@
/*
ALLOCATOR-HANDLE.hpp - front-end handle for custom allocation schemes
Copyright (C) Lumiera.org
2023, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file allocator-handle.hpp
** A front-end/concept to allow access to custom memory management.
** Minimalistic definition scheme for a functor-like object, which can be
** passed to client code, offering a callback to generate new objects into
** some custom allocation scheme not further disclosed.
**
** Lumiera employs various flavours of custom memory management, to handle
** allocation demands from performance critical parts of the application.
** Irrespective of the actual specifics of the allocation, typically there
** is some _instance_ of an allocator maintained within a carefully crafted
** context leading to the necessity to dependency-inject a suitable front-end
** into various connected parts of the application, to allow for coherent use
** of allocation while avoiding tight coupling of implementation internals.
**
** Reduced to the bare minimum, the _ability to allocate_ can be represented
** as a functor, which accepts arbitrary (suitable) arguments and returns a
** reference to a newly allocated instance of some specific type; such an
** _allocation front-end_ may then be passed as additional (template)
** parameter to associated classes or functions, allowing to generate new
** objects at stable memory location, which can then be wired internally.
**
** @todo 6/2023 this specification describes a *Concept*, not an actual
** interface type. After the migration to C++20, it will thus be
** possible to mark some arbitrary custom allocator / front-end
** with such a concept, thereby documenting proper API usage.
**
** @see allocation-cluster.hpp
** @see steam::fixture::Segment
** @see steam::engine::JobTicket
*/
#ifndef LIB_ALLOCATOR_HANDLE_H
#define LIB_ALLOCATOR_HANDLE_H
#include "lib/error.hpp"
#include "lib/nocopy.hpp"
#include <utility>
#include <list>
namespace lib {
/**
* Placeholder implementation for a custom allocator
* @todo shall be replaced by an AllocationCluster eventually
* @note conforming to a prospective C++20 Concept `Allo<JobTicket>`
* @remark using `std::list` container, since re-entrant allocation calls are possible,
* meaning that `emplace_front` will be called recursively from another ctor
* call invoked from `emplace_front`. Vector or Deque would be corrupted
* by such re-entrant calls, since both would alias the same entry....
*/
template<typename T>
class AllocatorHandle
: public std::list<T>
{
public:
template<typename...ARGS>
T&
operator() (ARGS&& ...args)
{
return this->emplace_front (std::forward<ARGS> (args)...);
}
};
} // namespace lib
#endif /*LIB_ALLOCATOR_HANDLE_H*/

View file

@ -100,10 +100,11 @@ using lib::LUID;
struct Prerequisite
{
Prerequisite* next{nullptr};
JobTicket const& descriptor;
JobTicket const& prereqTicket;
Prerequisite (JobTicket const& ticket)
: descriptor{ticket}
template<class ALO>
Prerequisite (ExitNode const& node, ALO& allocateTicket)
: prereqTicket{allocateTicket (node, allocateTicket)}
{ }
};
using Prerequisites = LinkedElements<Prerequisite>;
@ -131,7 +132,8 @@ using lib::LUID;
template<class IT>
static LinkedElements<Provision> buildProvisionSpec (IT);
static LinkedElements<Provision> buildProvisionSpec (ExitNode const&);
template<class ALO>
static LinkedElements<Provision> buildProvisionSpec (ExitNode const&, ALO&);
private:
JobTicket() { } ///< @internal as NIL marker, a JobTicket can be empty
@ -143,8 +145,9 @@ using lib::LUID;
{ }
public:
JobTicket (ExitNode const& exitNode)
: provision_{buildProvisionSpec (exitNode)}
template<class ALO>
JobTicket (ExitNode const& exitNode, ALO& allocator)
: provision_{buildProvisionSpec (exitNode, allocator)}
{ }
static const JobTicket NOP;
@ -163,7 +166,7 @@ using lib::LUID;
: provision_[slotNr].requirements.begin()
,[](Prerequisite& prq) -> JobTicket const&
{
return prq.descriptor;
return prq.prereqTicket;
});
}
@ -259,9 +262,9 @@ using lib::LUID;
operator->() const
{
REQUIRE (!empty() && toExplore_.top().isValid());
REQUIRE (toExplore_.top()->descriptor.isValid());
REQUIRE (toExplore_.top()->prereqTicket.isValid());
return & toExplore_.top()->descriptor;
return & toExplore_.top()->prereqTicket;
}
@ -336,8 +339,9 @@ using lib::LUID;
ENSURE (not isnil (provisionSpec));
return provisionSpec;
}
template<class ALO>
inline LinkedElements<JobTicket::Provision>
JobTicket::buildProvisionSpec (ExitNode const& exitNode)
JobTicket::buildProvisionSpec (ExitNode const& exitNode, ALO& allocTicket)
{
REQUIRE (not isnil (exitNode)); // has valid functor
LinkedElements<Provision> provisionSpec;
@ -345,8 +349,7 @@ using lib::LUID;
JobFunctor& func = exitNode.getInvocationFunctor();
auto& provision = provisionSpec.emplace<Provision> (func, exitNode, invoSeed);
for (ExitNode const& preNode: exitNode.getPrerequisites())
provision.requirements.emplace(preNode); /////////////////////////////////////////////TICKET #1292 : need to pass in Allocator as argument
//////////////////////////////////////////////////////////////////////OOO : where to ALLOCATE the prerequisite JobTickets ??!!
provision.requirements.emplace(preNode, allocTicket); ////////////////////////////////////TICKET #1292 : need to pass in generic Allocator as argument
return provisionSpec;
}

View file

@ -36,6 +36,7 @@
#include "steam/fixture/node-graph-attachment.hpp"
#include "steam/mobject/explicitplacement.hpp"
#include "steam/engine/job-ticket.hpp"
#include "lib/allocator-handle.hpp"
#include "lib/time/timevalue.hpp"
#include "lib/itertools.hpp"
#include "lib/util.hpp"
@ -67,8 +68,9 @@ namespace fixture {
*/
class Segment
{
using TicketAlloc = std::deque<engine::JobTicket>;
using PortTable = std::deque<std::reference_wrapper<const engine::JobTicket>>;
using JobTicket = engine::JobTicket;
using TicketAlloc = lib::AllocatorHandle<JobTicket>;
using PortTable = std::deque<std::reference_wrapper<const JobTicket>>;
protected:
@ -76,8 +78,8 @@ namespace fixture {
TimeSpan span_;
/** render plan / blueprint to use for this segment */
TicketAlloc tickets_;
PortTable portTab_;
TicketAlloc ticketAlloc_;
PortTable portTable_;
///////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #725 : placeholder code
/** relevant MObjects comprising this segment. */
@ -96,15 +98,15 @@ namespace fixture {
Segment (TimeSpan covered
,NodeGraphAttachment&& modelLink)
: span_{covered}
, tickets_{}
, portTab_{}
, ticketAlloc_{}
, portTable_{}
, exitNode{move (modelLink)}
{ }
Segment (Segment const& original, TimeSpan changed)
: span_{changed}
, tickets_{} // Note: not cloning tickets owned by Segment
, portTab_{}
, ticketAlloc_{} // Note: not cloning tickets owned by Segment
, portTable_{}
, exitNode{original.exitNode} /////////////////////////////////////////////////////////////////////OOO really? cloning ExitNodes?
{ }
@ -120,10 +122,10 @@ namespace fixture {
engine::JobTicket const&
jobTicket (size_t portNr) const
{
if (portNr >= portTab_.size())
if (portNr >= portTable_.size())
unConst(this)->generateTickets_onDemand (portNr);
ASSERT (portNr < portTab_.size());
return portTab_[portNr];
ASSERT (portNr < portTable_.size());
return portTable_[portNr];
}
bool
@ -137,13 +139,13 @@ namespace fixture {
void
generateTickets_onDemand (size_t portNr)
{
for (size_t i = portTab_.size(); i <= portNr; ++i)
for (size_t i = portTable_.size(); i <= portNr; ++i)
if (isnil (exitNode[portNr]))
portTab_.emplace_back (engine::JobTicket::NOP); // disable this slot
portTable_.emplace_back (engine::JobTicket::NOP); // disable this slot
else
{// Ticket was not generated yet...
tickets_.emplace_back (exitNode[portNr]);
portTab_.emplace_back (tickets_.back()); // ref to new ticket ‣ slot
ticketAlloc_(exitNode[portNr], ticketAlloc_);
portTable_.emplace_back (ticketAlloc_.back()); // ref to new ticket ‣ slot
}
}
};

View file

@ -55,6 +55,7 @@
#include "vault/engine/job.h"
#include "vault/engine/dummy-job.hpp"
#include "vault/real-clock.hpp"
#include "lib/allocator-handle.hpp"
#include "lib/time/timevalue.hpp"
#include "lib/diff/gen-node.hpp"
#include "lib/linked-elements.hpp"
@ -119,15 +120,22 @@ namespace test {
* @see DispatcherInterface_test
*/
class MockJobTicket
: public JobTicket
: private lib::AllocatorHandle<JobTicket>
, public JobTicket
{
auto&
allocator()
{
return static_cast<lib::AllocatorHandle<JobTicket>&> (*this);
}
public:
MockJobTicket()
: JobTicket{defineSimpleSpec()}
: JobTicket{defineSimpleSpec(), allocator()}
{ }
MockJobTicket (HashVal seed)
: JobTicket{defineSimpleSpec (seed)}
: JobTicket{defineSimpleSpec (seed), allocator()}
{ }
// template<class IT>

View file

@ -120,9 +120,9 @@ namespace test {
CHECK (13 == getMarker (ticket));
auto prereq = ticket.getPrerequisites();
CHECK (not isnil(prereq));
CHECK (23 == getMarker (*prereq));
CHECK (55 == getMarker (*prereq)); // Note: order of prerequisites is flipped (by LinkedElements)
++prereq;
CHECK (55 == getMarker (*prereq));
CHECK (23 == getMarker (*prereq));
++prereq;
CHECK (isnil(prereq));
}

View file

@ -64504,6 +64504,57 @@
</node>
</node>
</node>
<node CREATED="1686440015880" ID="ID_1210980349" MODIFIED="1686440023702" TEXT="Allokatoren">
<node CREATED="1686439921942" ID="ID_414891440" MODIFIED="1686440085275" TEXT="API-Scheme + Concept f&#xfc;r Allokator">
<linktarget COLOR="#61748b" DESTINATION="ID_414891440" ENDARROW="Default" ENDINCLINATION="-1705;141;" ID="Arrow_ID_1346780792" SOURCE="ID_1468838708" STARTARROW="None" STARTINCLINATION="-606;-35;"/>
<node CREATED="1686440109090" ID="ID_9110272" MODIFIED="1686440111594" TEXT="Allo">
<node CREATED="1686440112617" ID="ID_1724629144" MODIFIED="1686440118311" TEXT="ein Funktor">
<node CREATED="1686440141688" ID="ID_34122927" MODIFIED="1686440150192" TEXT="hat variadischen Function-call-Operator"/>
<node CREATED="1686440152351" ID="ID_466400198" MODIFIED="1686440164225" TEXT="liefert Referenz auf ein neu erzeugtes Objekt"/>
</node>
<node CREATED="1686440796916" ID="ID_1611026360" MODIFIED="1686440803081" TEXT="Zugriff">
<node CREATED="1686440803679" ID="ID_398802090" MODIFIED="1686440811090" TEXT="per Referenz auf eine Implementierung"/>
<node CREATED="1686440811749" ID="ID_1364654659" MODIFIED="1686440816921" TEXT="per Value Front-End">
<node CREATED="1686440832060" ID="ID_976218427" MODIFIED="1686440839350" TEXT="dieses verpackt einen Pointer"/>
<node CREATED="1686440839859" ID="ID_863438543" MODIFIED="1686440847211" TEXT="ist kopierbar und zuweisbar"/>
<node CREATED="1686440850702" ID="ID_40446495" MODIFIED="1686440971872" TEXT="implementiert den Function-call-Operator per Delegation">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
und zwar typischerweise per <i>Indirektion</i>&#160;an einen low-level Allocator, bei dem es sich aber auch um einen Slot in einem Allocation-Cluster handeln kann
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
<node CREATED="1686440973261" ID="ID_778520978" MODIFIED="1686441058168" TEXT="Lifecycle mu&#xdf; im Einzelfall gekl&#xe4;rt werden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<ul>
<li>
bevorzugt: die &#187;achitektonische L&#246;sung&#171; : es ist daf&#252;r gesorgt da&#223; die Allokator-Impl garantiert l&#228;nger lebt als der Client
</li>
<li>
in schwierigen F&#228;llen: ref-counting Front-End-Handle denkbar
</li>
</ul>
</body>
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node CREATED="1686440286925" ID="ID_1913917309" MODIFIED="1686440290128" TEXT="AlloP">
<node CREATED="1686440291217" ID="ID_1760718510" MODIFIED="1686440311118" TEXT="wie Allo; aber liefert smart-Ptr/Handle per Value "/>
</node>
</node>
</node>
</node>
<node CREATED="1482524641484" ID="ID_1651495185" MODIFIED="1557498707236" TEXT="Architektur">
<font NAME="SansSerif" SIZE="14"/>
@ -70068,7 +70119,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681742255171" ID="ID_1531898349" MODIFIED="1681744077783" TEXT="Draft im Test-Setup">
<icon BUILTIN="pencil"/>
<node COLOR="#435e98" CREATED="1681742836996" FOLDED="true" ID="ID_1978512771" MODIFIED="1685987633447" TEXT="scaffolding and mocking used for this test">
<node COLOR="#435e98" CREATED="1681742836996" FOLDED="true" ID="ID_1978512771" MODIFIED="1686449906200" TEXT="scaffolding and mocking used for this test">
<icon BUILTIN="full-1"/>
<node CREATED="1681742863121" ID="ID_101929835" MODIFIED="1684878277170" TEXT="ben&#xf6;tigte Mocks">
<icon BUILTIN="info"/>
@ -71981,9 +72032,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1684809928901" ID="ID_1559101169" MODIFIED="1684815403687" TEXT="die re-entranten Aufrufe vermeiden">
<node COLOR="#338800" CREATED="1684809928901" ID="ID_1559101169" MODIFIED="1686449970876" TEXT="die re-entranten Aufrufe sauber handhaben">
<icon BUILTIN="button_ok"/>
<node CREATED="1684809953633" ID="ID_1013476722" MODIFIED="1684809961752" TEXT="strukturelles Problem">
<linktarget COLOR="#84a8bc" DESTINATION="ID_1013476722" ENDARROW="Default" ENDINCLINATION="-1306;143;" ID="Arrow_ID_1604056061" SOURCE="ID_96252432" STARTARROW="None" STARTINCLINATION="502;-1667;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1684809963208" ID="ID_197980826" MODIFIED="1684810145770">
<richcontent TYPE="NODE"><html>
@ -74098,7 +74150,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1686009860309" ID="ID_1088673306" MODIFIED="1686151111541" TEXT="Generierung via Mock-ExitNodes">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1686009877359" ID="ID_224370768" MODIFIED="1686090285802" TEXT="bisheriger Zugang via MockJobTicket f&#xe4;llt praktisch weg">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686009877359" ID="ID_224370768" MODIFIED="1686450513497" TEXT="bisheriger Zugang via MockJobTicket f&#xe4;llt praktisch weg">
<icon BUILTIN="smiley-angry"/>
</node>
<node COLOR="#338800" CREATED="1686009918647" ID="ID_1552363345" MODIFIED="1686151106836" TEXT="Spec nun in Fake-ExitNode(s) &#xfc;bersetzen">
@ -74109,9 +74161,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686011373412" ID="ID_1341039933" MODIFIED="1686090506568" TEXT="Erzeugung l&#xe4;uft nun &#xfc;ber den realen JobTicket-ctor">
<node COLOR="#435e98" CREATED="1686011373412" ID="ID_1341039933" MODIFIED="1686450479521" TEXT="Erzeugung l&#xe4;uft nun &#xfc;ber den realen JobTicket-ctor">
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686090517445" ID="ID_7221274" MODIFIED="1686270873897" TEXT="zum Gl&#xfc;ck bleibt die eigentliche Logik strukturell gleich">
<node COLOR="#435e98" CREATED="1686090517445" ID="ID_7221274" MODIFIED="1686450469474" TEXT="zum Gl&#xfc;ck bleibt die eigentliche Logik strukturell gleich">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1686090545569" ID="ID_1454267269" MODIFIED="1686270818455" TEXT="nun werden eben geFakete Exit-Nodes intern gehalten">
@ -74120,8 +74172,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1686270785030" ID="ID_888586974" MODIFIED="1686270864625" TEXT="sp&#xe4;ter werden Exit-Nodes wohl ins low-level-Model wandern">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686270836231" ID="ID_1399765030" MODIFIED="1686270855660" TEXT="herausfinden wie der realte JobTicket-ctor sinnvoll funktionieren kann">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686270836231" ID="ID_1399765030" MODIFIED="1686450475966" TEXT="herausfinden wie der realte JobTicket-ctor sinnvoll funktionieren kann">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1686450483193" ID="ID_668106612" MODIFIED="1686450642546" TEXT="er bekommt eine ExitNode">
<arrowlink COLOR="#5dc473" DESTINATION="ID_1172741628" ENDARROW="Default" ENDINCLINATION="1479;0;" ID="Arrow_ID_1986389145" STARTARROW="None" STARTINCLINATION="1111;113;"/>
</node>
<node COLOR="#435e98" CREATED="1686450490722" ID="ID_471950405" MODIFIED="1686450642546" TEXT="plus ein Handle auf einen custom-Allocator">
<arrowlink COLOR="#5fcb3f" DESTINATION="ID_785034065" ENDARROW="Default" ENDINCLINATION="62;-466;" ID="Arrow_ID_67103593" STARTARROW="None" STARTINCLINATION="131;9;"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686263939639" ID="ID_1524676047" MODIFIED="1686270573171" STYLE="fork" TEXT="Problem: Enscheidung &#xfc;ber JobFunctor noch nicht m&#xf6;glich">
@ -74265,8 +74323,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1686089280610" ID="ID_331300527" MODIFIED="1686263718501" TEXT="Segment alloziert on-demand neues JobTicket">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1686089280610" ID="ID_331300527" MODIFIED="1686450653241" TEXT="Segment alloziert on-demand neues JobTicket">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686089580864" ID="ID_1949359516" MODIFIED="1686270557984" TEXT="Zugriff indiziert nach NodePort-Nr">
<icon BUILTIN="button_ok"/>
</node>
@ -74283,14 +74341,145 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686364650603" ID="ID_1148029855" MODIFIED="1686364718576" TEXT="Allozieren der prerequisite-JobTickets">
<linktarget COLOR="#fa197d" DESTINATION="ID_1148029855" ENDARROW="Default" ENDINCLINATION="599;43;" ID="Arrow_ID_433931878" SOURCE="ID_812723541" STARTARROW="None" STARTINCLINATION="205;12;"/>
<node COLOR="#338800" CREATED="1686364650603" ID="ID_1148029855" MODIFIED="1686450295671" TEXT="Allozieren der prerequisite-JobTickets">
<linktarget COLOR="#366caa" DESTINATION="ID_1148029855" ENDARROW="Default" ENDINCLINATION="599;43;" ID="Arrow_ID_433931878" SOURCE="ID_812723541" STARTARROW="None" STARTINCLINATION="205;12;"/>
<icon BUILTIN="clanbomber"/>
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1686365033392" HGAP="42" ID="ID_73811690" MODIFIED="1686365051620" TEXT="zwei M&#xf6;glichkeiten?" VSHIFT="-2">
<node COLOR="#435e98" CREATED="1686365033392" HGAP="42" ID="ID_73811690" MODIFIED="1686450276388" TEXT="zwei M&#xf6;glichkeiten?" VSHIFT="-2">
<icon BUILTIN="help"/>
<node CREATED="1686365053474" ID="ID_1746219617" MODIFIED="1686365061592" TEXT="wie das Haupt-Ticket im Segment"/>
<node CREATED="1686365062469" ID="ID_1687391140" MODIFIED="1686365089197" TEXT="direkt in der Prerequisite-Struktur im Haupt-Ticket"/>
<node CREATED="1686365053474" ID="ID_1746219617" MODIFIED="1686365061592" TEXT="wie das Haupt-Ticket im Segment">
<node CREATED="1686413111863" ID="ID_1744350817" MODIFIED="1686413361556" TEXT="pa&#xdf;t so gar nicht in das sch&#xf6;ne einfache Schema">
<icon BUILTIN="smiley-angry"/>
</node>
<node CREATED="1686413174454" ID="ID_987285372" MODIFIED="1686413369340" TEXT="erfodert Fallback-L&#xf6;sung f&#xfc;r Unit-Tests">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1686413193278" ID="ID_350369436" MODIFIED="1686413373537" TEXT="ist aber kongruent mit der l&#xe4;ngerfristigen L&#xf6;sung">
<linktarget COLOR="#4f7fb7" DESTINATION="ID_350369436" ENDARROW="Default" ENDINCLINATION="-102;6;" ID="Arrow_ID_1687809337" SOURCE="ID_585786945" STARTARROW="None" STARTINCLINATION="-151;0;"/>
<icon BUILTIN="forward"/>
<node COLOR="#338800" CREATED="1686418348105" ID="ID_785034065" MODIFIED="1686450634782" TEXT="also gleich einen Allocator durchgeben">
<linktarget COLOR="#5fcb3f" DESTINATION="ID_785034065" ENDARROW="Default" ENDINCLINATION="62;-466;" ID="Arrow_ID_67103593" SOURCE="ID_471950405" STARTARROW="None" STARTINCLINATION="131;9;"/>
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686418360062" ID="ID_39870309" MODIFIED="1686450266086" TEXT="AllocationCluster nutzbar?">
<icon BUILTIN="help"/>
<node CREATED="1686418368407" ID="ID_1859944923" MODIFIED="1686418378925" TEXT="naja.... OK">
<icon BUILTIN="smiley-oh"/>
</node>
<node CREATED="1686418380477" ID="ID_1966673617" MODIFIED="1686418388000" TEXT="es gibt einen Sch&#xf6;nwetter-Test"/>
<node CREATED="1686418388584" ID="ID_1037635245" MODIFIED="1686418400673" TEXT="ich sehe gleich X concurrency-Probleme"/>
<node COLOR="#435e98" CREATED="1686418401455" ID="ID_1403408841" MODIFIED="1686418448984" TEXT="und MemoryManager verwendete einen Vector">
<icon BUILTIN="broken-line"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686418421807" ID="ID_368896849" MODIFIED="1686418436824" TEXT="wenn der reloziert, sind alle Addressen invalid">
<icon BUILTIN="clanbomber"/>
</node>
<node COLOR="#338800" CREATED="1686418437579" ID="ID_1800637749" MODIFIED="1686418442864" TEXT="umgestellt auf deque">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1686441550274" ID="ID_1919931806" MODIFIED="1686441600880" TEXT="erst mal zur&#xfc;ckstellen (und auf C++20 warten)">
<arrowlink COLOR="#638498" DESTINATION="ID_547425739" ENDARROW="Default" ENDINCLINATION="-17;-68;" ID="Arrow_ID_1341361393" STARTARROW="None" STARTINCLINATION="115;7;"/>
<icon BUILTIN="hourglass"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1686435337023" ID="ID_625457882" MODIFIED="1686449865371" TEXT="dann doch besser erst mal nur ein generisches &#xbb;Allo&#xab; concept">
<icon BUILTIN="yes"/>
<node COLOR="#435e98" CREATED="1686436153294" ID="ID_312944305" MODIFIED="1686441163818" TEXT="Problem: generisch oder spezifisch?">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1686436173657" ID="ID_1046876021" MODIFIED="1686436196164" TEXT="generisch &#x2261; kann beliebige Typen konstruieren"/>
<node CREATED="1686436197019" ID="ID_1405705756" MODIFIED="1686436217710" TEXT="spezifisch &#x2261; kann nur JobTicket-Instanzen allozieren"/>
<node CREATED="1686436296914" ID="ID_1997952244" MODIFIED="1686436346538">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
aktuell w&#228;re spezifisch besser &#8212;
</p>
<p>
aber AllocationCluster w&#228;re generisch
</p>
</body>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
</node>
<node COLOR="#338800" CREATED="1686436487594" ID="ID_261720071" MODIFIED="1686441533018" TEXT="API-Form">
<icon BUILTIN="yes"/>
<node CREATED="1686436505933" ID="ID_1399093834" MODIFIED="1686436517137" TEXT="wie dr&#xfc;ckt man klar aus, was erwartet wird?"/>
<node CREATED="1686438910086" ID="ID_547425739" MODIFIED="1686441600881" TEXT="l&#xe4;uft auf ein Concept hinaus....">
<linktarget COLOR="#638498" DESTINATION="ID_547425739" ENDARROW="Default" ENDINCLINATION="-17;-68;" ID="Arrow_ID_1341361393" SOURCE="ID_1919931806" STARTARROW="None" STARTINCLINATION="115;7;"/>
<icon BUILTIN="idea"/>
<node CREATED="1686439833069" ID="ID_1579820839" MODIFIED="1686439911617" TEXT="es gibt auch Concepts f&#xfc;r Templates">
<arrowlink COLOR="#415ab4" DESTINATION="ID_197491932" ENDARROW="Default" ENDINCLINATION="-1574;159;" ID="Arrow_ID_1382804093" STARTARROW="None" STARTINCLINATION="-2029;0;"/>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1686439480081" ID="ID_982475231" MODIFIED="1686439504225" TEXT="in den meisten F&#xe4;llen w&#xfc;rde aber die spezifische Form gen&#xfc;gen"/>
<node CREATED="1686439647154" ID="ID_1365242995" MODIFIED="1686439681562" TEXT="der konkrete Allokator w&#xfc;rde dann die spezifische Form erf&#xfc;llen"/>
<node CREATED="1686441227623" ID="ID_481507036" MODIFIED="1686441237721" TEXT="...und darf ansonsten ein komplex gebauter Typ sein"/>
</node>
<node CREATED="1686439686598" ID="ID_1468838708" MODIFIED="1686440085274">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
<b>Beschlu&#223;</b>: Allo &#8801; Funktor mit variadischen Argumenten
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#61748b" DESTINATION="ID_414891440" ENDARROW="Default" ENDINCLINATION="-1705;141;" ID="Arrow_ID_1346780792" STARTARROW="None" STARTINCLINATION="-606;-35;"/>
<icon BUILTIN="yes"/>
</node>
<node COLOR="#338800" CREATED="1686445235596" ID="ID_788695273" MODIFIED="1686445262013" TEXT="im Hinblick darauf: einface Fake-Impl aus Segment extrahiert">
<icon BUILTIN="button_ok"/>
<node CREATED="1686445301608" ID="ID_354239024" MODIFIED="1686445313956" TEXT="lib/allocator-handle.hpp">
<icon BUILTIN="info"/>
</node>
<node CREATED="1686445265684" ID="ID_1519805948" MODIFIED="1686445272535" TEXT="verpackt letztlich nur eine deque"/>
<node CREATED="1686445273243" ID="ID_872771317" MODIFIED="1686445286478" TEXT="aber hat schon eine Signatur gem&#xe4;&#xdf; Allo"/>
<node CREATED="1686445287457" ID="ID_1326242669" MODIFIED="1686445296363" TEXT="und ist getemplated auf den Ergebnistyp"/>
</node>
</node>
<node COLOR="#338800" CREATED="1686441276178" ID="ID_1870780666" MODIFIED="1686449834405" TEXT="JobTicket-ctor bekommt nun verbindlich eine Allo-Ref">
<icon BUILTIN="button_ok"/>
<node CREATED="1686441465496" ID="ID_749128062" MODIFIED="1686441521583" TEXT="sinnvoll, da es nun auch stets auf bestehende ExitNode angewiesen ist">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1686441482318" ID="ID_872674673" MODIFIED="1686449822579" TEXT="MockJobTicket bekommt damit den neuen Sinn, dies alles kompakt f&#xfc;r Tests zu verpacken">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686449851892" ID="ID_96252432" MODIFIED="1686450255979" TEXT="der Allocator mu&#xdf; re-Entrance-f&#xe4;hig sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
exakt dieses Problem hatte ich schon vor einigen Wochen, bei der ersten (damals Mock)-Implementierung: da die Prerequisites private sind, gibt es keine andere L&#246;sung als sie aus dem &#252;bergeordneten ctor heraus zu konstruieren, und damit re-entrant aus dem JobTicket-ctor ein weiteres JobTicket zu allozieren. Vector und Deque k&#246;nnen das nicht hanhaben, und es kommt zu einem gef&#228;hrlichen Aliasing, bei dem das geschachtelte Ticket an der gleichen Stelle im Speicher steht wie das Haupt-Ticket, und damit dessen ctor-Aufruf korrumpiert
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#84a8bc" DESTINATION="ID_1013476722" ENDARROW="Default" ENDINCLINATION="-1306;143;" ID="Arrow_ID_1604056061" STARTARROW="None" STARTINCLINATION="502;-1667;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node CREATED="1686365062469" ID="ID_1687391140" MODIFIED="1686365089197" TEXT="direkt in der Prerequisite-Struktur im Haupt-Ticket">
<node CREATED="1686413048626" ID="ID_327677209" MODIFIED="1686413356388" TEXT="w&#xe4;re zun&#xe4;chst billig zu haben">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1686413060692" ID="ID_106604854" MODIFIED="1686413352163" TEXT="ist aber letztlich eine Heap-Allokation">
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1686413069852" ID="ID_585786945" MODIFIED="1686413380860" TEXT="und m&#xfc;&#xdf;te sp&#xe4;ter auf einen explizit gegebenen Allocator umgestellt werden">
<arrowlink COLOR="#4f7fb7" DESTINATION="ID_350369436" ENDARROW="Default" ENDINCLINATION="-102;6;" ID="Arrow_ID_1687809337" STARTARROW="None" STARTINCLINATION="-151;0;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
</node>
@ -74343,7 +74532,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1686270678269" ID="ID_1696777369" MODIFIED="1686361087711" TEXT="Spec-Erzeugung durch ExitNode ersetzen">
<linktarget COLOR="#bf3856" DESTINATION="ID_1696777369" ENDARROW="Default" ENDINCLINATION="47;-15;" ID="Arrow_ID_1288742892" SOURCE="ID_116441332" STARTARROW="None" STARTINCLINATION="-91;7;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686270700679" ID="ID_1172741628" MODIFIED="1686361068947" TEXT="JobTIcket-ctor akzeptiert ExitNode const&amp;">
<node COLOR="#338800" CREATED="1686270700679" ID="ID_1172741628" MODIFIED="1686361068947" TEXT="JobTicket-ctor akzeptiert ExitNode const&amp;">
<linktarget COLOR="#5dc473" DESTINATION="ID_1172741628" ENDARROW="Default" ENDINCLINATION="1479;0;" ID="Arrow_ID_1986389145" SOURCE="ID_668106612" STARTARROW="None" STARTINCLINATION="1111;113;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1686270722814" ID="ID_1222081090" MODIFIED="1686361081278" TEXT="bisherige Traversierungs-Logik sinngem&#xe4;&#xdf; hier &#xfc;bersetzen">
@ -74373,7 +74563,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1686090113552" HGAP="35" ID="ID_1222153026" MODIFIED="1686361148882" TEXT="ExitNode (wie bisher die Spec) an JobTicket-ctor weitergeben" VSHIFT="43">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686090919949" HGAP="27" ID="ID_929102409" MODIFIED="1686091184043" VSHIFT="10">
<node COLOR="#435e98" CREATED="1686090919949" HGAP="27" ID="ID_929102409" MODIFIED="1686450462296" VSHIFT="10">
<richcontent TYPE="NODE"><html>
<head>
@ -74397,10 +74587,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#599eb9" DESTINATION="ID_1552363345" ENDARROW="Default" ENDINCLINATION="623;43;" ID="Arrow_ID_940031570" STARTARROW="None" STARTINCLINATION="738;-108;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1686092906718" HGAP="35" ID="ID_1605426517" MODIFIED="1686184589923" TEXT="FixtureSegment_test" VSHIFT="-3">
<node COLOR="#338800" CREATED="1686092906718" HGAP="35" ID="ID_1605426517" MODIFIED="1686450454254" TEXT="FixtureSegment_test" VSHIFT="-3">
<linktarget COLOR="#5aec6d" DESTINATION="ID_1605426517" ENDARROW="Default" ENDINCLINATION="-104;-6;" ID="Arrow_ID_658388334" SOURCE="ID_31746915" STARTARROW="None" STARTINCLINATION="570;-91;"/>
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686361157528" ID="ID_565360581" MODIFIED="1686361167333" TEXT="SEGFAULT">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1686361157528" ID="ID_565360581" MODIFIED="1686450400722" TEXT="SEGFAULT">
<icon BUILTIN="broken-line"/>
<node CREATED="1686361493991" ID="ID_423058577" MODIFIED="1686361526825" TEXT="tritt nicht bei jedem Lauf auf &#x27f9; vermutlich dangling pointer"/>
<node CREATED="1686361820600" ID="ID_780766515" MODIFIED="1686361835540">
@ -74442,7 +74632,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686364368098" ID="ID_1576782710" MODIFIED="1686364421501" TEXT="prereq-JobTickets werden nirgends alloziert/gespeichert">
<node COLOR="#435e98" CREATED="1686364368098" ID="ID_1576782710" MODIFIED="1686450397352" TEXT="prereq-JobTickets werden nirgends alloziert/gespeichert">
<icon BUILTIN="broken-line"/>
<node CREATED="1686364436691" ID="ID_462388515" MODIFIED="1686364452584">
<richcontent TYPE="NODE"><html>
@ -74472,13 +74662,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1686364486502" ID="ID_1943162539" MODIFIED="1686364548847" TEXT="der neue JobTicket-ctor ist nicht explicit &#x27f9; automatische Konversion">
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686364557872" ID="ID_812723541" MODIFIED="1686365118116" TEXT="im Prerequisite wird nur ein Pointer gespeichert">
<arrowlink COLOR="#fa197d" DESTINATION="ID_1148029855" ENDARROW="Default" ENDINCLINATION="599;43;" ID="Arrow_ID_433931878" STARTARROW="None" STARTINCLINATION="205;12;"/>
<node COLOR="#435e98" CREATED="1686364557872" ID="ID_812723541" MODIFIED="1686450382137" TEXT="im Prerequisite wird nur ein Pointer gespeichert">
<arrowlink COLOR="#366caa" DESTINATION="ID_1148029855" ENDARROW="Default" ENDINCLINATION="599;43;" ID="Arrow_ID_433931878" STARTARROW="None" STARTINCLINATION="205;12;"/>
<icon BUILTIN="clanbomber"/>
</node>
<node COLOR="#338800" CREATED="1686450309353" ID="ID_1974551952" LINK="#ID_785034065" MODIFIED="1686450332417" TEXT="L&#xf6;sung: Custom-Allocator durchreichen">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1686450436378" ID="ID_751655173" MODIFIED="1686450451503" STYLE="fork" TEXT="l&#xe4;uft... (puh!)">
<icon BUILTIN="ksmiletris"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1686014291202" ID="ID_252150549" MODIFIED="1686014413608" TEXT="Problem: wie kommt man an die portNum?">
<arrowlink COLOR="#fe3f50" DESTINATION="ID_1087682281" ENDARROW="Default" ENDINCLINATION="326;21;" ID="Arrow_ID_676319361" STARTARROW="None" STARTINCLINATION="309;-20;"/>
@ -81010,6 +81206,41 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1617654117016" ID="ID_1078296581" LINK="https://github.com/lewissbaker/cppcoro" MODIFIED="1617654125575" TEXT="Cppcoro"/>
</node>
</node>
<node CREATED="1686439783608" ID="ID_25677654" MODIFIED="1686439786528" TEXT="Concepts">
<node CREATED="1686438949795" ID="ID_197491932" LINK="https://stackoverflow.com/a/68238680" MODIFIED="1686439911618" TEXT="Concepts f&#xfc;r Templates">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...also f&#252;r template templtate parameter;
</p>
<p>
f&#252;r diese mu&#223; man allerdings stets die umst&#228;ndlichere <i>requires</i>-Syntax verwenden
</p>
<p>
</p>
<pre http-equiv="content-type" content="text/html; charset=utf-8" class="lang-cpp s-code-block"><code class="hljs language-cpp"><font color="#1f237b">template &lt;template &lt;typename...&gt; class ALO&gt;
concept Allocator = true; // actual constraint here
template&#160;&lt;template&#160;&lt;typename...&gt; class&#160;ALO&gt;
&#160;requires&#160;Allocator&lt;ALO&gt;
class Something
{ };</font></code></pre>
<p>
</p>
<p>
...man kann aber auch ein Concept als Kombination weiterer definieren
</p>
</body>
</html></richcontent>
<linktarget COLOR="#415ab4" DESTINATION="ID_197491932" ENDARROW="Default" ENDINCLINATION="-1574;159;" ID="Arrow_ID_1382804093" SOURCE="ID_1579820839" STARTARROW="None" STARTINCLINATION="-2029;0;"/>
<icon BUILTIN="info"/>
</node>
</node>
</node>
<node CREATED="1636143147825" ID="ID_224980157" MODIFIED="1636143159589" TEXT="Assembly">
<node CREATED="1636143161969" ID="ID_1119605136" MODIFIED="1636143179445" TEXT="r?x : 64-Bit-Regixter"/>