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:
parent
f25ec2f5ef
commit
b18e79d077
7 changed files with 396 additions and 56 deletions
|
|
@ -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
|
||||
|
|
|
|||
94
src/lib/allocator-handle.hpp
Normal file
94
src/lib/allocator-handle.hpp
Normal 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*/
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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ü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> 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ß im Einzelfall geklärt werden">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<ul>
|
||||
<li>
|
||||
bevorzugt: die »achitektonische Lösung« : es ist dafür gesorgt daß die Allokator-Impl garantiert länger lebt als der Client
|
||||
</li>
|
||||
<li>
|
||||
in schwierigen Fä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:   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ötigte Mocks">
|
||||
<icon BUILTIN="info"/>
|
||||
|
|
@ -71981,9 +72032,10 @@ Date:   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:   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ällt praktisch weg">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1686009877359" ID="ID_224370768" MODIFIED="1686450513497" TEXT="bisheriger Zugang via MockJobTicket fä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) übersetzen">
|
||||
|
|
@ -74109,9 +74161,9 @@ Date:   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äuft nun über den realen JobTicket-ctor">
|
||||
<node COLOR="#435e98" CREATED="1686011373412" ID="ID_1341039933" MODIFIED="1686450479521" TEXT="Erzeugung läuft nun ü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ück bleibt die eigentliche Logik strukturell gleich">
|
||||
<node COLOR="#435e98" CREATED="1686090517445" ID="ID_7221274" MODIFIED="1686450469474" TEXT="zum Glü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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1686270785030" ID="ID_888586974" MODIFIED="1686270864625" TEXT="spä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 über JobFunctor noch nicht möglich">
|
||||
|
|
@ -74265,8 +74323,8 @@ Date:   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:   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öglichkeiten?" VSHIFT="-2">
|
||||
<node COLOR="#435e98" CREATED="1686365033392" HGAP="42" ID="ID_73811690" MODIFIED="1686450276388" TEXT="zwei Mö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ßt so gar nicht in das schöne einfache Schema">
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
</node>
|
||||
<node CREATED="1686413174454" ID="ID_987285372" MODIFIED="1686413369340" TEXT="erfodert Fallback-Lösung für Unit-Tests">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1686413193278" ID="ID_350369436" MODIFIED="1686413373537" TEXT="ist aber kongruent mit der längerfristigen Lö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ö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ü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 »Allo« 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 ≡ kann beliebige Typen konstruieren"/>
|
||||
<node CREATED="1686436197019" ID="ID_1405705756" MODIFIED="1686436217710" TEXT="spezifisch ≡ kann nur JobTicket-Instanzen allozieren"/>
|
||||
<node CREATED="1686436296914" ID="ID_1997952244" MODIFIED="1686436346538">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
aktuell wäre spezifisch besser —
|
||||
</p>
|
||||
<p>
|
||||
aber AllocationCluster wä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ückt man klar aus, was erwartet wird?"/>
|
||||
<node CREATED="1686438910086" ID="ID_547425739" MODIFIED="1686441600881" TEXT="lä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ü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ällen würde aber die spezifische Form genügen"/>
|
||||
<node CREATED="1686439647154" ID="ID_1365242995" MODIFIED="1686439681562" TEXT="der konkrete Allokator würde dann die spezifische Form erfü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ß</b>: Allo ≡ 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äß 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ü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ß re-Entrance-fä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ösung als sie aus dem übergeordneten ctor heraus zu konstruieren, und damit re-entrant aus dem JobTicket-ctor ein weiteres JobTicket zu allozieren. Vector und Deque können das nicht hanhaben, und es kommt zu einem gefä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äre zunä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üßte spä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:   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&">
|
||||
<node COLOR="#338800" CREATED="1686270700679" ID="ID_1172741628" MODIFIED="1686361068947" TEXT="JobTicket-ctor akzeptiert ExitNode const&">
|
||||
<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äß hier übersetzen">
|
||||
|
|
@ -74373,7 +74563,7 @@ Date:   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:   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 ⟹ vermutlich dangling pointer"/>
|
||||
<node CREATED="1686361820600" ID="ID_780766515" MODIFIED="1686361835540">
|
||||
|
|
@ -74442,7 +74632,7 @@ Date:   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:   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 ⟹ 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ö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ä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:   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ür Templates">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...also für template templtate parameter;
|
||||
</p>
|
||||
<p>
|
||||
für diese muß man allerdings stets die umstä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 <template <typename...> class ALO>
|
||||
concept Allocator = true; // actual constraint here
|
||||
|
||||
template <template <typename...> class ALO>
|
||||
 requires Allocator<ALO>
|
||||
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"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue