From: "G.B." <bauhaus@futureapps.invalid>
Subject: Re: A simple question about the "new" allocator
Date: Tue, 12 Aug 2014 15:38:20 +0200
Date: 2014-08-12T15:38:20+02:00 [thread overview]
Message-ID: <lsd5ca$pj0$1@dont-email.me> (raw)
In-Reply-To: <q8dnwsh5glsw.1f88qzc525z4r$.dlg@40tude.net>
On 12.08.14 09:35, Dmitry A. Kazakov wrote:
> On Mon, 11 Aug 2014 23:54:50 -0700 (PDT), NiGHTS wrote:
>
>> With all default configurations using a typical Ada compiler, will the following code run indefinitely without fail or will it eventually crash?
>>
>> procedure main is
>>
>> Test : access Positive;
>>
>> begin
>>
>> loop
>> Test := new Positive;
>> end loop;
>>
>> end main;
>>
>> If this does crash, what would be another way to write this program so
>> that it does not crash?
>>
>> I would prefer not to use Ada.Unchecked_Deallocation.
>
> Write a custom memory pool that does not allocate anything. Make Test a
> pointer to that pool.
>
> P.S. It might sound silly, but such pools are actually useful. When the
> object is already allocated and you want to initialize it and get a pointer
> to, one way to do that is using a fake allocator.
One such storage pool, tailored to the problem, and therefore likely
not applicable to every problem:
with System.Storage_Pools;
with System.Storage_Elements;
generic
type T is private;
package My_Switching_Pool is
pragma Preelaborate (My_Switching_Pool);
use System;
type Alternating_Pool
is new Storage_Pools.Root_Storage_Pool with private;
-- Provides storage for exactly two items of formal type `T`.
overriding
procedure Allocate
(Pool : in out Alternating_Pool;
Storage_Address : out Address;
Size_In_Storage_Elements : in Storage_Elements.Storage_Count;
Alignment : in Storage_Elements.Storage_Count);
-- makes the other of the two items available for storage
overriding
procedure Deallocate
(Pool : in out Alternating_Pool;
Storage_Address : in Address;
Size_In_Storage_Elements : in Storage_Elements.Storage_Count;
Alignment : in Storage_Elements.Storage_Count);
overriding
function Storage_Size
(Pool : Alternating_Pool) return Storage_Elements.Storage_Count;
private
type Names is (Fst, Snd);
type Pair is array (Names) of T;
type Alternating_Pool
is new Storage_Pools.Root_Storage_Pool with
record
In_Use : Names := Snd;
end record;
The_Data : Pair;
end My_Switching_Pool;
package body My_Switching_Pool is
overriding
procedure Allocate
(Pool : in out Alternating_Pool;
Storage_Address : out Address;
Size_In_Storage_Elements : in Storage_Elements.Storage_Count;
Alignment : in Storage_Elements.Storage_Count)
is
begin
-- switch components of `The_Data`
Pool.In_Use := (if Pool.In_Use = Fst
then Snd
else Fst);
Storage_Address := The_Data (Pool.In_Use)'Address;
end Allocate;
overriding
procedure Deallocate
(Pool : in out Alternating_Pool;
Storage_Address : in Address;
Size_In_Storage_Elements : in Storage_Elements.Storage_Count;
Alignment : in Storage_Elements.Storage_Count)
is
begin
null;
end Deallocate;
overriding
function Storage_Size
(Pool : Alternating_Pool)
return Storage_Elements.Storage_Count
is
use type Storage_Elements.Storage_Count;
begin
return Pair'Size / Storage_Elements.Storage_Element'Size;
end Storage_Size;
end My_Switching_Pool;
with My_Switching_Pool;
procedure Main is
package Two_Numbers is new My_Switching_Pool (T => Positive);
The_Pool : Two_Numbers.Alternating_Pool;
type Positive_Ptr is access Positive
with Storage_Pool => The_Pool;
Test : Positive_Ptr;
begin
loop
Test := new Positive;
end loop;
end Main;
next prev parent reply other threads:[~2014-08-12 13:38 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-12 6:54 A simple question about the "new" allocator NiGHTS
2014-08-12 7:35 ` Dmitry A. Kazakov
2014-08-12 13:38 ` G.B. [this message]
2014-08-12 10:29 ` sbelmont700
2014-08-12 18:49 ` Shark8
2014-08-12 19:10 ` Adam Beneschan
2014-08-12 21:53 ` Niklas Holsti
2014-08-12 22:34 ` Adam Beneschan
2014-08-12 23:14 ` sbelmont700
2014-08-12 23:41 ` Adam Beneschan
2014-08-13 7:36 ` Dmitry A. Kazakov
2014-08-13 15:04 ` Adam Beneschan
2014-08-13 20:32 ` Niklas Holsti
2014-08-12 15:10 ` Adam Beneschan
2014-08-12 16:07 ` Jeffrey Carter
2014-08-12 19:58 ` Robert A Duff
2014-08-12 17:51 ` NiGHTS
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox