Library: lib::Several container now passes test with TrackingAllocator

- decided to allow creating empty lib::Several;
  no need to be overly rigid in this point,
  since it is move-assignable anyway...

- populate with enough elements to provoke several reallocations
  with copying over the existing elements
- precisely calculate and verify the expected allocation size
- verify the use-count due to dedicated allocator instances
  being embedded into both the builder and hidden in the deleter
- move-assign data
- all checksums go to zero at end
This commit is contained in:
Fischlurch 2024-06-18 19:09:21 +02:00
parent 50306db164
commit aacea3c10a
3 changed files with 105 additions and 63 deletions

View file

@ -158,7 +158,7 @@ namespace lib {
* Typically the return type is an interface,
* and the Implementation wraps some datastructure
* holding subclasses.
* @warning in rework 5/2025
* @note may only be populated through SeveralBuilder
*/
template<class I>
class Several
@ -169,9 +169,9 @@ namespace lib {
Bucket data_{nullptr};
Several() =default; ///< may only be created through SeveralBuilder
public:
Several() =default; ///< usually to be created through SeveralBuilder
~Several() noexcept
try { if (data_) data_->destroy(); }
ERROR_LOG_AND_IGNORE (progress, "clean-up Several data")

View file

@ -551,7 +551,10 @@ namespace test{
}
/** @test TODO demonstrate integration with a custom allocator
* - use the TrackingAllocator to verify balanced handling
* of the underlying raw memory allocations
* @todo WIP 6/24 🔁 define 🔁 implement
*/
void
@ -559,36 +562,47 @@ namespace test{
{
CHECK (0 == Dummy::checksum());
CHECK (0 == TrackingAllocator::checksum());
SHOW_EXPR(TrackingAllocator::numAlloc());
SHOW_EXPR(TrackingAllocator::numBytes());
SHOW_EXPR(TrackingAllocator::use_count());
auto& log = TrackingAllocator::log;
log.clear("Several-Builder-Test");
Several<Dummy> elms;
size_t expectedAlloc;
CHECK (0 == TrackingAllocator::numAlloc());
CHECK (0 == TrackingAllocator::use_count());
{
auto builder = makeSeveral<Dummy>()
.withAllocator<test::TrackAlloc>();
SHOW_TYPE(decltype(builder))
SHOW_EXPR(builder.size())
SHOW_EXPR(builder.capacity())
builder.fillElm(55);
SHOW_EXPR(builder.size())
SHOW_EXPR(builder.capacity())
SHOW_EXPR(TrackingAllocator::numAlloc());
SHOW_EXPR(TrackingAllocator::numBytes());
SHOW_EXPR(TrackingAllocator::use_count());
SHOW_EXPR(TrackingAllocator::checksum());
.withAllocator<test::TrackAlloc>()
.fillElm(55);
size_t elmSiz = sizeof(Dummy);
size_t buffSiz = elmSiz * builder.capacity();
size_t headerSiz = sizeof(ArrayBucket<Dummy>);
expectedAlloc = headerSiz + buffSiz;
CHECK (TrackingAllocator::numBytes() == expectedAlloc);
CHECK (TrackingAllocator::numAlloc() == 1);
CHECK (TrackingAllocator::use_count()== 2); // one instance in the builder, one in the deleter
CHECK (TrackingAllocator::checksum() > 0);
elms = builder.build();
}
CHECK (elms.size() == 55);
CHECK (TrackingAllocator::numBytes() == expectedAlloc);
CHECK (TrackingAllocator::numAlloc() == 1);
CHECK (TrackingAllocator::use_count()== 1); // only one allocator instance in the deleter left
auto others = move(elms);
CHECK (elms.size() == 0);
CHECK (others.size() == 55);
CHECK (TrackingAllocator::numBytes() == expectedAlloc);
CHECK (TrackingAllocator::numAlloc() == 1);
CHECK (TrackingAllocator::use_count()== 1);
others = move(Several<Dummy>{}); // automatically triggers de-allocation
CHECK (others.size() == 0);
CHECK (0 == Dummy::checksum());
SHOW_EXPR(TrackingAllocator::numAlloc());
SHOW_EXPR(TrackingAllocator::numBytes());
SHOW_EXPR(TrackingAllocator::use_count());
SHOW_EXPR(TrackingAllocator::checksum());
cout << "____Tracking-Allo-Log_________\n"
<< util::join(TrackingAllocator::log,"\n")
<< "\n───╼━━━━━━━━━━━━━━━━━╾────────"<<endl;
CHECK (0 == TrackingAllocator::numBytes());
CHECK (0 == TrackingAllocator::numAlloc());
CHECK (0 == TrackingAllocator::use_count());
CHECK (0 == TrackingAllocator::checksum());
}
};

View file

@ -83480,8 +83480,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="stop-sign"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1718365424109" ID="ID_1414527850" MODIFIED="1718365440812" TEXT="ben&#xf6;tigt: Schema zum Einrichten des Allokators">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1718365424109" ID="ID_1414527850" MODIFIED="1718730128866" TEXT="ben&#xf6;tigt: Schema zum Einrichten des Allokators">
<icon BUILTIN="button_ok"/>
<node CREATED="1718365443600" ID="ID_826094679" MODIFIED="1718365447214" TEXT="Nutzmuster">
<node CREATED="1718365455761" ID="ID_1839293953" MODIFIED="1718365460053" TEXT="Typ gegeben">
<node CREATED="1718365476302" ID="ID_1390595799" MODIFIED="1718365485145" TEXT="das mu&#xdf; dann aber ein Template-Template sein"/>
@ -83507,7 +83507,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1718366856119" ID="ID_785388847" MODIFIED="1718366879219" TEXT="der SeveralBuilder nimmt den kompletten Typ der AllocationPolicy"/>
<node CREATED="1718366892178" ID="ID_997504046" MODIFIED="1718369131234" TEXT="dieser mu&#xdf; korrekt mit den anderen Typ-Parametern I und E instantiiert worden sein"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1718365914668" ID="ID_347456374" MODIFIED="1718367155482" TEXT="Problem: Inferenz">
<node COLOR="#435e98" CREATED="1718365914668" ID="ID_347456374" MODIFIED="1718730142162" TEXT="Problem: Inferenz">
<linktarget COLOR="#f46464" DESTINATION="ID_347456374" ENDARROW="Default" ENDINCLINATION="17;-202;" ID="Arrow_ID_1949614691" SOURCE="ID_312263866" STARTARROW="None" STARTINCLINATION="-58;5;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1718366978511" ID="ID_1008148490" MODIFIED="1718367000513" TEXT="gegeben">
@ -83523,7 +83523,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1718367280430" ID="ID_666047930" MODIFIED="1718367295858" TEXT="zus&#xe4;tzlich: Erweiterungspunkt gefordert">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1718367280430" ID="ID_666047930" MODIFIED="1718730138202" TEXT="zus&#xe4;tzlich: Erweiterungspunkt gefordert">
<icon BUILTIN="yes"/>
<node CREATED="1718367354045" ID="ID_351719166" MODIFIED="1718367379648" TEXT="um die AllocationPolicy an zuk&#xfc;nftige Allokator-Setups anzupassen"/>
<node CREATED="1718367386303" ID="ID_30749831" MODIFIED="1718367408489" TEXT="idealerweise ohne diese direkt im Header several-builder.hpp referenzieren zu m&#xfc;ssen"/>
@ -83563,8 +83563,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1718400888786" ID="ID_1044695658" MODIFIED="1718400893126" TEXT="somit: kein Problem!"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1718401002675" ID="ID_594290716" MODIFIED="1718412451294" TEXT="erst mal default-Setup anfangen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1718401002675" ID="ID_594290716" MODIFIED="1718730087219" TEXT="erst mal default-Setup anfangen">
<icon BUILTIN="button_ok"/>
<node CREATED="1718408497231" ID="ID_744823200" MODIFIED="1718408514033" TEXT="Bestandteile">
<node CREATED="1718408520500" ID="ID_1541328453" MODIFIED="1718408533939" TEXT="Konfigurations-Template">
<node CREATED="1718408556207" ID="ID_73442585" MODIFIED="1718408561538" TEXT="im Namespace lib::allo"/>
@ -83626,6 +83626,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#8a4398" CREATED="1718730092408" ID="ID_579341832" MODIFIED="1718730119407" TEXT="ganz sch&#xf6;n komplexes setup .... funktioniert aber auf Anhieb">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1718412437319" ID="ID_947832201" MODIFIED="1718412481457" TEXT="dann Spezialisierung f&#xfc;r AllocationCluster">
<icon BUILTIN="pencil"/>
@ -83693,7 +83697,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#2c878c" CREATED="1718412901000" ID="ID_1589785077" MODIFIED="1718412970228" TEXT="YESS!!! der Compiler fri&#xdf;t das">
<icon BUILTIN="ksmiletris"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1718581460854" ID="ID_1938493773" MODIFIED="1718674324815" TEXT="erst mal mit einem nachvollziebaren Allocator verifizieren...">
<node COLOR="#338800" CREATED="1718581460854" ID="ID_1938493773" MODIFIED="1718730079073" TEXT="erst mal mit einem nachvollziebaren Allocator verifizieren...">
<arrowlink COLOR="#49596d" DESTINATION="ID_360498640" ENDARROW="Default" ENDINCLINATION="177;-168;" ID="Arrow_ID_1985044400" STARTARROW="None" STARTINCLINATION="-601;28;"/>
<linktarget COLOR="#2a81b2" DESTINATION="ID_1938493773" ENDARROW="Default" ENDINCLINATION="-141;780;" ID="Arrow_ID_814216426" SOURCE="ID_1342074261" STARTARROW="None" STARTINCLINATION="664;-34;"/>
<icon BUILTIN="yes"/>
@ -83971,9 +83975,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1718581783068" ID="ID_1789618356" MODIFIED="1718581797769" TEXT="standardkonformen custom-Allocator ankoppeln">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#5b178b" CREATED="1718674398898" ID="ID_1136800053" MODIFIED="1718726484671" TEXT="Checksumme vom TrackingAllocator &#x27f2; wrapped">
<node COLOR="#338800" CREATED="1718581783068" ID="ID_1789618356" MODIFIED="1718730052016" TEXT="standardkonformen custom-Allocator ankoppeln">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#5b178b" CREATED="1718674398898" FOLDED="true" ID="ID_1136800053" MODIFIED="1718726484671" TEXT="Checksumme vom TrackingAllocator &#x27f2; wrapped">
<icon BUILTIN="broken-line"/>
<node CREATED="1718674427169" ID="ID_516703978" MODIFIED="1718674444637" TEXT="lt. Log sehen die Alloc/Dealloc-Paare alle sauber aus"/>
<node CREATED="1718674446057" ID="ID_801400606" MODIFIED="1718674470177" TEXT="die gewrappte Summe deutet auf einen &#xfc;bersch&#xfc;ssigen de-Alloc hin"/>
@ -83983,8 +83987,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1718718804897" ID="ID_1202983917" MODIFIED="1718718821977" TEXT="das wirft einen klar einen Verdacht auf den Deleter"/>
</node>
</node>
<node CREATED="1718718825148" ID="ID_22765547" MODIFIED="1718718831526" TEXT="Untersuchung Deleter-Verhalten">
<node CREATED="1718718825148" ID="ID_22765547" MODIFIED="1718730064321" TEXT="Untersuchung Deleter-Verhalten">
<icon BUILTIN="list"/>
<node CREATED="1718718832485" ID="ID_1963316300" MODIFIED="1718718836535" TEXT="10 Elemente">
<node CREATED="1718718837569" ID="ID_895298215" MODIFIED="1718718844013" TEXT="kein Checksummen-Fehler"/>
<node CREATED="1718718844622" ID="ID_545810670" MODIFIED="1718718852756" TEXT="use-count bleibt aber 1 am Ende"/>
@ -83994,13 +83998,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1718718906083" ID="ID_1914635563" MODIFIED="1718718912133" TEXT="use-count bleibt 2 am Ende"/>
</node>
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1718718952386" ID="ID_1833378958" MODIFIED="1718726465896" TEXT="&#x27f9; Schlu&#xdf;folgerungen">
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1718718952386" FOLDED="true" ID="ID_1833378958" MODIFIED="1718726465896" TEXT="&#x27f9; Schlu&#xdf;folgerungen">
<node COLOR="#435e98" CREATED="1718718968137" ID="ID_113992967" MODIFIED="1718726544827" TEXT="der Destruktor des Funktors selber wird nicht aufgerufen">
<node CREATED="1718720020327" ID="ID_97951871" MODIFIED="1718720077878" TEXT="im Fall von re-Alloc ist das ein konzeptioneller Fehler">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
denn dort rufen wir den Destruktor-Funktor explizit auf, anstatt den Destruktor von ArrayBucket aufzurufe
@ -84011,9 +84014,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1718720078908" ID="ID_1281202485" MODIFIED="1718720144715" TEXT="es mu&#xdf; aber noch einen weiteres Problem geben">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...denn auch am Ende bleibt ein use-cnt &#252;brig, obwohl doch in diesem Fall letztlich der Destruktor des Funktors aufgerufen werden sollte, wenngleich auch bereits nach der de-Allokation (!)
@ -84024,9 +84025,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1718722668290" ID="ID_592162062" MODIFIED="1718722673197" TEXT="das ist das gleiche Problem"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1718722673857" ID="ID_1638861888" MODIFIED="1718726537767" TEXT="tats&#xe4;chlich wollte ich den Destruktor nicht nach der de-Allokation aufrufen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...deshalb habe ich da so sonderbar darum herum gecodet. Ich dachte mir, kein Problem, ArrayBucket ist ja sowiso ein POD. Und dann bin ich &#187;eingeknickt&#171; und habe doch eine std::function genommen. Und deren Destruktor <b>mu&#223;</b>&#160;aufgerufen werden
@ -84042,9 +84041,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#435e98" CREATED="1718718995909" ID="ID_1826487879" MODIFIED="1718726502584" TEXT="beim re-Alloc mu&#xdf; irgendwo eine Data-corruption verborgen sein">
<node CREATED="1718719106342" ID="ID_1068879050" MODIFIED="1718719187571" TEXT="warum kein double-free?">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
weil vor jeder regul&#228;ren &#196;nderung der Checksumme auch ein Log-Aufruf steht. Und die Log-Eintr&#228;ge sehen allesamt korrekt und balanaciert aus
@ -84062,9 +84059,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="broken-line"/>
<node CREATED="1718720426940" ID="ID_956992006" MODIFIED="1718722346350" TEXT="es wird inkonsistent geloggt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -84080,9 +84075,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1718720455410" ID="ID_918494351" MODIFIED="1718720546328" TEXT="die Checksumme h&#xe4;ngt von der Aufruf-Reihenfolge ab">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...f&#228;lschlicherweise der laufende Allokations-Counter verwendet
@ -84108,9 +84101,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1718725747821" ID="ID_1108981895" MODIFIED="1718725778611" TEXT="all das mu&#xdf; k&#xfc;nftig &#xfc;ber Template-Parameter bereits statsich festgelegt werden"/>
<node CREATED="1718725820365" ID="ID_115242482" MODIFIED="1718725961225" TEXT="ein trivialer Destructor wird sich per EBO reduzieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...konkret, ich plane einen Satz an Steuer-Flags, und auf dieser Basis dann die Belegung weiterer Storage; im einfachsten Fall gibt es keinen Spread, keinen Deleter und einen Standard-Offset; es mu&#223; dann nur die Element-Zahl und Kapazit&#228;t gespeichert werden.
@ -84135,6 +84126,43 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1718730152368" ID="ID_660244460" MODIFIED="1718730214146" TEXT="funktioniert sauber">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
provoziere mehrere re-Allokationen
</li>
<li>
pr&#252;fe die use-counts f&#252;r die eingebetteten Allokator-Instanzen
</li>
<li>
move-Asignments r&#228;umen auch sauber auf
</li>
</ul>
</body>
</html></richcontent>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1718730232613" ID="ID_194573786" MODIFIED="1718730397838" TEXT="AllocationCluster ankoppeln">
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1718730253250" ID="ID_361490227" MODIFIED="1718730391736" TEXT="m&#xfc;&#xdf;te sogar mit der gleichen schon bestehenden front-End-Instanz funktionieren">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1718730287657" ID="ID_1835018318" MODIFIED="1718730388370" TEXT="den gleichen Test-Zyklus mit mehreren re-Allocs machen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1718730299524" ID="ID_1847366954" MODIFIED="1718730388370" TEXT="verifizieren, da&#xdf; die dynamische Anpassung stattgefunden hat">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1718730317115" ID="ID_1509954190" MODIFIED="1718730388371" TEXT="es sollte sich genau die gleiche Speicherbelegung ergeben">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1718730353373" ID="ID_819034170" MODIFIED="1718730388372" TEXT="Objekt-Cleanup findet statt &#x2014; aber keine de-Allokation">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>