comp.lang.ada
 help / color / mirror / Atom feed
From: Jere <jhb.chat@gmail.com>
Subject: Re: Custom Storage Pool questions
Date: Mon, 13 Sep 2021 18:04:47 -0700 (PDT)	[thread overview]
Message-ID: <036086ba-ea40-44cb-beb7-cded0f501cfbn@googlegroups.com> (raw)
In-Reply-To: <shmnk1$lgf$1@franka.jacob-sparre.dk>

On Monday, September 13, 2021 at 1:29:39 AM UTC-4, Randy Brukardt wrote:
> Not sure what you are expecting. There is no requirement that objects are 
> allocated contigiously. Indeed, Janus/Ada will call Allocate as many times 
> as needed for each object; for instance, unconstrained arrays are in two 
> parts (descriptor and data area). 
> 
No expectations.  Just questions.  I wasn't concerned with whether the
allocated memory was contiguous or not, but whether an implementation
is required to supply the correct size of memory needed to allocate an object
or if it is allowed to pass a value to Size that is less than the amount of
memory actually needed.  For example, the blog there indicates the 
maintainer of the custom storage pool needs to account for First/Last
indexes of an unconstrained array separately instead of assuming that value is
included as part of the Size parameter's value.

If the Size parameter doesn't require that it includes space for First/Last
for unconstrained arrays or Prev/Next for controlled objects (assuming
that is even the implementation picked of course), then I'm not seeing
a way to write a custom storage pool that is portable because you need
to account for each implementation's "hidden" values that are not represented
in the Size parameter.  For example if Janus calculated Size to have
both the size of the array and the size of First and Last but GNAT didn't 
and my storage pool assumed the JANUS method, then if someone
used my storage pool with GNAT then it would access memory 
from some other location potentially and erroneously.

> The only thing that you can assume in a portable library is that you get 
> called the same number of times and sizes/alignment for Allocate and 
> Deallocate; there's no assumptions about size or alignment that you can 
> make. 
So to be clear, you cannot assume that Size and Alignment are appropriate
for the actual object being allocated correct?  Size could actually be
less than the actual amount of memory needed and the alignment may only
apply to part of the object being allocated, not the full object?

Is that correct?  I'm asking because that is what the blog suggests with
the example it gave.

> 
> If you want to build a pool around some specific allocated size, then if it 
> needs to be portable, (A) you have to calculate the allocated size, and (B) 
> you have to have a mechanism for what to do if some other size is requested. 
> (Allocate a whole block for smaller sizes, fall back to built-in heap for 
> too large is what I usually do). 
> 
Are there any good tricks to handle this?  For example, if I design a 
storage pool around constructing a particular type of object, what is
normally done to discourage another programmer from using the pool with
an entirely different type?  Maybe raise an exception if the size isn't exact?
I'm not sure what else, unless maybe there is an Aspect/Attribute that 
can be set to ensure only a specific type of object can be constructed.



HISTORY:
> 
> 
> 
> "Jere" <> wrote in message 
> news:e3c5c553-4a7f-408a...@googlegroups.com...
> >I was learning about making user defined storage pools when 
> > I came across an article that made me pause and wonder how 
> > portable storage pools actually can be. In particular, I assumed 
> > that the Size_In_Storage_Elements parameter in the Allocate 
> > operation actually indicated the total number of storage elements 
> > needed. 
> > 
> > procedure Allocate( 
> > Pool : in out Root_Storage_Pool; 
> > Storage_Address : out Address; 
> > Size_In_Storage_Elements : in Storage_Elements.Storage_Count; 
> > Alignment : in Storage_Elements.Storage_Count) is abstract; 
> > 
> > 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 
> > 
> > So that seems to mean to make a storage pool, I have to make it 
> > compiler specific or else risk someone creating a type like an 
> > array and my allocation size and address values will be off. 
> > 
> > Is it intended not to be able to do portable Storage Pools or am 
> > I missing some Ada functionality that helps me out here. I 
> > scanned through the list of attributes but none seem to give 
> > any info about where the object's returned address is relative 
> > to the top of the memory actually allocated for the object. I saw 
> > the attribute Max_Size_In_Storage_Elements, but it doesn't seem 
> > to guarantee to include things like the array indices and it still 
> > doesn't solve the issue of knowing where the returned address 
> > needs to be relative to the top of allocated memory. 
> > 
> > I can easily use a generic to ensure that the types I care about 
> > are portably made by the pool, but I can't prevent someone from 
> > using my pool to create other objects that I hadn't accounted for. 
> > Unless there is a way to restrict a pool from allocating objects 
> > of other types?

  reply	other threads:[~2021-09-14  1:04 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 [this message]
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
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