From: Victor Porton <porton@narod.ru>
Subject: Re: Allocators design flaw
Date: Sat, 14 Oct 2017 17:11:25 +0300
Date: 2017-10-14T17:11:25+03:00 [thread overview]
Message-ID: <ort5uc$1i31$1@gioia.aioe.org> (raw)
In-Reply-To: orru6n$1hak$1@gioia.aioe.org
Victor Porton wrote:
> It is impossible to properly implement an allocator through a C function
> (such as raptor_alloc_memory() from Raptor C library) which allocates a
> struct and returns the pointer to the allocated struct.
>
> It is because RM13.11(21.5/3) "The Alignment parameter is a nonzero
> integral multiple of D'Alignment..."
>
> (If it were "The Alignment parameter is equal to D'Alignment", then we
> would be able just to check (in Allocate procedure implementation) that
>
> pragma Assert(Dummy_Record'Alignment mod Alignment = 0);
> -- where Dummy_Record is an arbitrary C-convention record
> -- (as all C records have the same alignment reqs)
>
> So Alignment parameter may be arbitrarily big and the C function alignment
> may not conform to it.
>
> Let us think how to work around (in Ada 202x) of this design flaw.
The best solution I found for my concrete problem (allocate a C struct with
the C library allocating function raptor_alloc_memory() rather then with the
standard storage pool) is:
Let the (C compatible) type of the struct be T.
Using raptor_alloc_memory() allocate a void* pointer for an object of size
'Max_Size_In_Storage_Elements. Using some black magic () transform void*
into an access to T.
See https://groups.google.com/forum/#!topic/comp.lang.ada/-xfDsAOMj5s
about the "black magic" to convert void* to an access.
(I need to use 'Max_Size_In_Storage_Elements for allocation size to be sure
assignment to my object won't overflow anything, right?)
--
Victor Porton - http://portonvictor.org
prev parent reply other threads:[~2017-10-14 14:11 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-14 2:53 Allocators design flaw Victor Porton
2017-10-14 7:27 ` Dmitry A. Kazakov
2017-10-14 13:52 ` Victor Porton
2017-10-14 14:25 ` Dmitry A. Kazakov
2017-10-14 14:03 ` Victor Porton
2017-10-14 14:26 ` Dmitry A. Kazakov
2017-10-14 15:18 ` Victor Porton
2017-10-14 15:44 ` Dmitry A. Kazakov
2017-10-14 16:42 ` Victor Porton
2017-10-14 16:13 ` Simon Wright
2017-10-14 16:38 ` Victor Porton
2017-10-14 14:12 ` Victor Porton
2017-10-14 14:20 ` Victor Porton
2017-10-14 14:24 ` Victor Porton
2017-10-14 14:36 ` Dmitry A. Kazakov
2017-10-14 15:17 ` Victor Porton
2017-10-14 15:51 ` Dmitry A. Kazakov
2017-10-14 16:34 ` Victor Porton
2017-10-14 17:14 ` Dmitry A. Kazakov
2017-10-14 17:24 ` Victor Porton
2017-10-14 18:08 ` Dmitry A. Kazakov
2017-10-14 14:28 ` Dmitry A. Kazakov
2017-10-14 15:14 ` Victor Porton
2017-10-14 15:42 ` Simon Wright
2017-10-14 16:29 ` Victor Porton
2017-10-14 20:07 ` Simon Wright
2017-10-14 21:26 ` Victor Porton
2017-10-21 1:42 ` Randy Brukardt
2017-10-14 8:02 ` Simon Wright
2017-10-14 13:59 ` Victor Porton
2017-10-14 14:35 ` Simon Wright
2017-10-14 15:11 ` Victor Porton
2017-10-14 15:56 ` Simon Wright
2017-10-14 16:22 ` Victor Porton
2017-10-29 16:01 ` David Thompson
2017-10-14 14:11 ` Victor Porton [this message]
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox