From 7d066a85eecf7af51fc519dd5fffb8c648d053cf Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Tue, 18 Jun 2024 23:51:14 +0200 Subject: [PATCH] Library: now use `AllocationCluster` as custom allocator * this validates usage of the extension point * however, there is no special treatment yet, and thus a re-alloc leves the previoius block as waste --- tests/library/several-builder-test.cpp | 29 ++++++++++++++ wiki/thinkPad.ichthyo.mm | 53 ++++++++++++++++---------- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/tests/library/several-builder-test.cpp b/tests/library/several-builder-test.cpp index b407e6683..4d5c818f3 100644 --- a/tests/library/several-builder-test.cpp +++ b/tests/library/several-builder-test.cpp @@ -32,6 +32,7 @@ #include "lib/test/test-coll.hpp" #include "lib/test/test-helper.hpp" #include "lib/test/diagnostic-output.hpp"////////////////TODO +#include "lib/allocation-cluster.hpp" #include "lib/iter-explorer.hpp" #include "lib/format-util.hpp" #include "lib/util.hpp" @@ -604,6 +605,34 @@ namespace test{ CHECK (0 == TrackingAllocator::numAlloc()); CHECK (0 == TrackingAllocator::use_count()); CHECK (0 == TrackingAllocator::checksum()); + + AllocationCluster clu; + { + auto builder = makeSeveral() + .withAllocator(clu) + .reserve(5) + .fillElm(5); + + size_t buffSiz = sizeof(Dummy) * builder.capacity(); + size_t headerSiz = sizeof(ArrayBucket); + expectedAlloc = headerSiz + buffSiz; +SHOW_EXPR(expectedAlloc) +SHOW_EXPR(builder.size()) +SHOW_EXPR(builder.capacity()) +SHOW_EXPR(clu.numExtents()) +SHOW_EXPR(clu.numBytes()) + builder.append (Dummy{23}); +SHOW_EXPR(builder.capacity()) + + buffSiz = sizeof(Dummy) * builder.capacity(); +SHOW_EXPR(buffSiz) +SHOW_EXPR(buffSiz + expectedAlloc) +SHOW_EXPR(buffSiz + headerSiz) +SHOW_EXPR(builder.size()) +SHOW_EXPR(builder.capacity()) +SHOW_EXPR(clu.numExtents()) +SHOW_EXPR(clu.numBytes()) + } } }; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 8a73c492a..341f2a9fa 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -83545,7 +83545,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -83563,7 +83563,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -83689,6 +83689,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ @@ -84009,8 +84010,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
denn dort rufen wir den Destruktor-Funktor explizit auf, anstatt den Destruktor von ArrayBucket aufzurufe

- - +
@@ -84020,8 +84020,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
...denn auch am Ende bleibt ein use-cnt übrig, obwohl doch in diesem Fall letztlich der Destruktor des Funktors aufgerufen werden sollte, wenngleich auch bereits nach der de-Allokation (!)

- -
+ @@ -84031,8 +84030,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
...deshalb habe ich da so sonderbar darum herum gecodet. Ich dachte mir, kein Problem, ArrayBucket ist ja sowiso ein POD. Und dann bin ich »eingeknickt« und habe doch eine std::function genommen. Und deren Destruktor muß aufgerufen werden

- -
+
@@ -84047,8 +84045,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
weil vor jeder regulären Änderung der Checksumme auch ein Log-Aufruf steht. Und die Log-Einträge sehen allesamt korrekt und balanaciert aus

- - +
@@ -84070,8 +84067,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - +
@@ -84081,8 +84077,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
...fälschlicherweise der laufende Allokations-Counter verwendet

- -
+
@@ -84107,8 +84102,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
...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ß dann nur die Element-Zahl und Kapazität gespeichert werden.

- - +
@@ -84152,6 +84146,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ @@ -84613,13 +84608,29 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - - + - + + + + + + + + + + +

+ versteckte Inkonsistenz mit der Deleter-Behandlung aufgedeckt +

+ +
+ +
+
+ +