From: Simon Wright <simon@pushface.org>
Subject: Re: Custom Storage Pool questions
Date: Wed, 15 Sep 2021 17:43:57 +0100 [thread overview]
Message-ID: <ly5yv1bxgy.fsf@pushface.org> (raw)
In-Reply-To: e3c5c553-4a7f-408a-aaa7-60ec0b70202dn@googlegroups.com
Jere <jhb.chat@gmail.com> writes:
> But after reading the following AdaCore article, my assumption is now
> called into question:
> https://blog.adacore.com/header-storage-pools
>
> In particular, the blog there advocates for separately counting for
> things like unconstrained array First/Last indices or the Prev/Next
> pointers used for Controlled objects. Normally I would have assumed
> that the Size_In_Storage_Elements parameter in Allocate would account
> for that, but the blog clearly shows that it doesn't
Well, I may well have missed the point somewhere, and maybe things have
changed since 2015, but as far as I can see, with FSF GCC 11.1.0, the
technique described in the blog is completely unnecessary.
To save having to recompile the runtime with debug symbols, I wrote a
tiny pool which delegates to GNAT's
System.Pool_Global.Global_Pool_Object (the default pool), e.g.
overriding procedure Allocate
(Pool : in out My_Pool.Pool;
Storage_Address : out Address;
Size_In_Storage_Elements : in Storage_Elements.Storage_Count;
Alignment : in Storage_Elements.Storage_Count)
is
pragma Unreferenced (Pool);
begin
Global_Pool_Object.Allocate
(Address => Storage_Address,
Storage_Size => Size_In_Storage_Elements,
Alignment => Alignment);
end Allocate;
and I find with
Pool : My_Pool.Pool;
type C is new Ada.Finalization.Controlled with null record;
type Cs is array (Natural range <>) of C;
type Csp is access Cs with Storage_Pool => Pool;
procedure Free is new Ada.Unchecked_Deallocation (Cs, Csp);
Pcs : Csp;
begin
Pcs := new Cs (0 .. 5);
Free (Pcs);
that
* the alignment requested is 8 (was 4 for an array of Boolean);
* the size requested is 72, which is 24 bytes more than required for the
6 minimal POs;
* the value returned by Allocate is 24 bytes more than the address of
the array object Pcs (which is the same as that of Pcs(0));
* the value passed to Deallocate is the same as that returned by
Allocate.
I think it's more than likely (!) that the extra allocation of 24 bytes
is made up of 2 pointers at 8 bytes each, used to implement the
finalization chain, and two integers at 4 bytes each, holding the array
bounds.
So I'd say that to create a pool with extra header information, you'd
need to allocate space for your header + padding to ensure that the
compiler's object is properly aligned + the compiler-requested size,
aligned to the max of your header's alignment and the compiler-requested
alignment.
Mind, I don't quite see how to actually access the header info for a
particular allocation ...
next prev parent reply other threads:[~2021-09-15 16:43 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-13 0:53 Custom Storage Pool questions Jere
2021-09-13 5:29 ` Randy Brukardt
2021-09-14 1:04 ` Jere
2021-09-21 0:06 ` Randy Brukardt
2021-09-18 11:32 ` Simon Wright
2021-09-20 0:31 ` Jere
2021-09-20 6:34 ` Niklas Holsti
2021-09-20 6:48 ` Emmanuel Briot
2021-09-20 7:35 ` Dmitry A. Kazakov
2021-09-20 16:59 ` Shark8
2021-09-21 0:50 ` Randy Brukardt
2021-09-21 23:08 ` Jere
2021-09-28 4:42 ` Randy Brukardt
2021-10-02 23:19 ` Jere
2021-10-03 8:52 ` Dmitry A. Kazakov
2021-10-14 1:26 ` Randy Brukardt
2021-09-13 11:12 ` J-P. Rosen
2021-09-14 0:48 ` Jere
2021-09-14 6:08 ` J-P. Rosen
2021-09-15 0:39 ` Jere
2021-09-15 7:01 ` Simon Wright
2021-09-16 23:32 ` Jere
2021-09-20 23:51 ` Randy Brukardt
2021-09-21 22:40 ` Jere
2021-09-14 6:23 ` Dmitry A. Kazakov
2021-09-14 6:42 ` J-P. Rosen
2021-09-14 7:00 ` Dmitry A. Kazakov
2021-09-20 23:58 ` Randy Brukardt
2021-09-15 0:21 ` Jere
2021-09-15 6:54 ` Dmitry A. Kazakov
2021-09-20 23:48 ` Randy Brukardt
2021-09-14 10:54 ` Egil H H
2021-09-15 0:11 ` Jere
2021-09-15 16:43 ` Simon Wright [this message]
2021-09-15 17:03 ` Simon Wright
2021-09-15 19:07 ` Dmitry A. Kazakov
2021-09-15 20:40 ` Simon Wright
2021-09-16 7:12 ` Emmanuel Briot
2021-09-16 23:21 ` Jere
2021-09-17 7:08 ` Emmanuel Briot
2021-09-17 7:18 ` Simon Wright
2021-09-17 13:56 ` Dmitry A. Kazakov
2021-09-17 19:46 ` Simon Wright
2021-09-17 20:39 ` Dmitry A. Kazakov
2021-09-17 21:17 ` Niklas Holsti
2021-09-18 7:49 ` Dmitry A. Kazakov
2021-09-18 9:03 ` Niklas Holsti
2021-09-18 10:22 ` Dmitry A. Kazakov
2021-09-18 15:59 ` Niklas Holsti
2021-09-18 16:19 ` Dmitry A. Kazakov
2021-09-19 10:36 ` Niklas Holsti
2021-09-19 11:41 ` Dmitry A. Kazakov
2021-09-20 7:05 ` Niklas Holsti
2021-09-20 7:35 ` Dmitry A. Kazakov
2021-09-20 8:08 ` Niklas Holsti
2021-09-20 8:28 ` Dmitry A. Kazakov
2021-09-21 0:45 ` Randy Brukardt
2021-09-21 0:40 ` Randy Brukardt
2021-09-21 0:30 ` Randy Brukardt
2021-09-21 0:37 ` Randy Brukardt
2021-09-21 6:28 ` Dmitry A. Kazakov
2021-09-28 4:38 ` Randy Brukardt
2021-09-28 7:00 ` Dmitry A. Kazakov
2021-09-21 0:26 ` Randy Brukardt
2021-09-21 6:51 ` Dmitry A. Kazakov
2021-09-28 4:31 ` Randy Brukardt
2021-09-28 6:56 ` Dmitry A. Kazakov
2021-09-28 7:52 ` Simon Wright
2021-09-28 8:07 ` Dmitry A. Kazakov
2021-09-28 22:04 ` Randy Brukardt
2021-09-29 7:57 ` Dmitry A. Kazakov
2021-09-29 14:41 ` Shark8
2021-09-29 15:16 ` Dmitry A. Kazakov
2021-09-30 0:16 ` Randy Brukardt
2021-09-30 8:08 ` Dmitry A. Kazakov
2021-10-01 0:04 ` Randy Brukardt
2021-10-01 8:25 ` Dmitry A. Kazakov
2021-10-02 9:06 ` Randy Brukardt
2021-10-02 10:18 ` Dmitry A. Kazakov
2021-10-03 4:33 ` Randy Brukardt
2021-10-03 8:40 ` Dmitry A. Kazakov
2021-10-14 1:21 ` Randy Brukardt
2021-10-14 3:12 ` philip...@gmail.com
2021-10-14 7:31 ` Dmitry A. Kazakov
2021-10-15 0:36 ` Randy Brukardt
2021-10-15 8:08 ` Stephen Leake
2021-10-15 8:18 ` Dmitry A. Kazakov
2021-10-15 22:22 ` Randy Brukardt
2021-10-15 8:15 ` Dmitry A. Kazakov
2021-10-15 22:44 ` Randy Brukardt
2021-10-16 9:00 ` Dmitry A. Kazakov
2021-10-16 14:32 ` Simon Wright
2021-10-16 15:06 ` Dmitry A. Kazakov
2021-10-18 14:23 ` Shark8
2021-09-21 0:19 ` Randy Brukardt
2021-09-21 0:18 ` Randy Brukardt
2021-09-16 8:41 ` Dmitry A. Kazakov
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox