From: Dmitry A. Kazakov <mailbox@dmitry-kazakov.de>
Subject: Re: Question about OO programming in Ada
Date: Wed, 03 Dec 2003 15:45:18 +0100
Date: 2003-12-03T15:45:18+01:00 [thread overview]
Message-ID: <adsrsvss2kg70ll26h1tpdvvavk8fnatj0@4ax.com> (raw)
In-Reply-To: m3iskyt2hk.fsf@insalien.org
On 03 Dec 2003 15:11:51 +0100, Ludovic Brenta
<ludovic.brenta@insalien.org> wrote:
>Dmitry A. Kazakov <mailbox@dmitry-kazakov.de> writes:
>
>But the GNAT doc says that deallocation occurs when the storage pool
>is finalized. Your example does not demonstrate this since your
>storage pool does not override Finalize.
Of course, when storage pool object gets destroyed the memory of the
objects allocated there will be reclaimed (though without calling
Unchecked_Deallocate on them, in a hope that it was already made
before)
>> with Ada.Finalization;
>> with System; use System;
>> with System.Storage_Elements; use System.Storage_Elements;
>> with System.Storage_Pools; use System.Storage_Pools;
>> package A is
>> type Misty is
>> new Ada.Finalization.Limited_Controlled with null record;
>> procedure Finalize (X : in out Misty);
>> type Pool is new Root_Storage_Pool with record
>> Free : Storage_Offset := 1;
>> Memory : aliased Storage_Array (1..1024);
>> end record;
>> procedure Allocate
>> ( Stack : in out Pool;
>> Place : out Address;
>> Size : Storage_Count;
>> Alignment : Storage_Count
>> );
>> procedure Deallocate
>> ( Stack : in out Pool;
>> Place : Address;
>> Size : Storage_Count;
>> Alignment : Storage_Count
>> );
>> function Storage_Size (Stack : Pool) return Storage_Count;
>
> procedure Finalize (Stack : in out Pool);
>
>> end A;
>>
>> with Text_IO; use Text_IO;
>> package body A is
>> procedure Finalize (X : in out Misty) is
>> begin
>> Put_Line ("finalized!");
>> end Finalize;
>> procedure Allocate
>> ( Stack : in out Pool;
>> Place : out Address;
>> Size : Storage_Count;
>> Alignment : Storage_Count
>> ) is
>> begin -- Alignment is ignored for simplicity sake
>> Put_Line ("Allocated");
>> Place := Stack.Memory (Stack.Free)'Address;
>> Stack.Free := Stack.Free + Size;
>> end Allocate;
>> procedure Deallocate
>> ( Stack : in out Pool;
>> Place : Address;
>> Size : Storage_Count;
>> Alignment : Storage_Count
>> ) is
>> begin -- Does nothing
>> Put_Line ("Deallocated");
>> end Deallocate;
>> function Storage_Size (Stack : Pool) return Storage_Count is
>> begin
>> return 0;
>> end Storage_Size;
>
> procedure Finalize (Stack : in out Pool) is
> begin
> Put_Line ("Deallocating all objects.");
> Deallocate (Stack, To_Address (Integer_Address (0)), 0, 0);
> end Finalize;
>
>> end A;
>>
>> with A; use A;
>> with Text_IO; use Text_IO;
>> procedure Test is
>> Storage : Pool;
>> begin
>> Put_Line ("Begin of a scope");
>> declare
>> type Pointer is access Misty;
>> for Pointer'Storage_Pool use Storage;
>> X : Pointer;
>> begin
>> X := new Misty; -- This is not dangled!
>> end;
>> Put_Line ("End of the scope");
>> end Test;
>>
>> With GNAT Test should print:
>>
>> Begin of a scope
>> Allocated
>> finalized!
>
> Deallocating all objects. (yes, I tested it)
> Deallocated
>
>> End of the scope
>>
>> So even with a user-defined pool it does not work as "should be".
>>
>> Of course one could call Unchecked_Deallocation from Finalize as
>> Pascal noted. But it would be awful for an uncounted number of
>> reasons. To start with, you never know, who calls Finalize, then you
>> have no pointer to the object, you can get it, but that will be of a
>> generic access type, so if you have several pools how do you know,
>> where the object was allocated? and so on and so far.
>
>The finalization is not that of the allocated objects, it is that of
>the storage pool itself (storage pools are limited controlled). So,
>this scheme actually works pretty well and is quite straightforward to
>implement.
Only if the scope of the access type and the scope of the pool object
are same.
>The part that I do not understand is why GNAT's Unbounded_Reclaim_Pool
>doesn't seem to be selected for a local access type. I think this
>either contradicts the GNAT reference manual, or is an instance of me
>not understanding it.
But to make it working there should be a new object of
Unbounded_Reclaim_Pool per scope:
declare
type Pointer is access Controlled_Something;
should be translated into:
declare
Local_Pool : Unbounded_Reclaim_Pool;
type Pointer is access Controlled_Something;
for Pointer'Storage_Pool use Local_Pool;
Theoretically it is possible, but practically? Maybe there is only one
object of Unbounded_Reclaim_Pool [per task?]
--
Regards,
Dmitry Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2003-12-03 14:45 UTC|newest]
Thread overview: 109+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-11-25 19:04 Question about OO programming in Ada Ekkehard Morgenstern
2003-11-25 20:17 ` Randy Brukardt
2003-11-26 0:34 ` Ekkehard Morgenstern
2003-11-26 6:17 ` Vinzent 'Gadget' Hoefler
2003-11-26 9:29 ` Dmitry A. Kazakov
2003-11-26 15:54 ` Stephen Leake
2003-11-26 20:07 ` Randy Brukardt
2003-11-26 21:36 ` Stephen Leake
2003-11-26 8:56 ` Peter Hermann
2003-11-25 20:55 ` Martin Krischik
2003-11-26 0:22 ` Ekkehard Morgenstern
2003-11-26 1:00 ` Jeffrey Carter
2003-11-26 16:36 ` Martin Krischik
2003-11-26 18:09 ` Robert I. Eachus
2003-11-27 13:45 ` Jean-Pierre Rosen
2003-11-25 21:48 ` Stephen Leake
2003-11-26 0:01 ` Ekkehard Morgenstern
2003-11-26 1:16 ` Jeffrey Carter
2003-11-26 15:10 ` Georg Bauhaus
2003-11-26 15:48 ` Stephen Leake
2003-11-26 16:24 ` Hyman Rosen
2003-11-26 17:58 ` Robert I. Eachus
2003-11-27 2:10 ` Ekkehard Morgenstern
2003-11-27 10:15 ` Ludovic Brenta
2003-11-27 18:35 ` Jeffrey Carter
2003-11-28 4:35 ` Hyman Rosen
2003-11-28 7:28 ` Vinzent 'Gadget' Hoefler
2003-11-28 8:46 ` Dale Stanbrough
2003-11-28 10:16 ` Vinzent 'Gadget' Hoefler
2003-12-01 15:57 ` Martin Krischik
2003-12-01 16:47 ` Hyman Rosen
2003-12-03 18:35 ` Martin Krischik
2003-12-01 21:13 ` Jeffrey Carter
2003-12-02 8:47 ` Dmitry A. Kazakov
2003-12-03 9:29 ` Pascal Obry
2003-12-03 11:26 ` Dmitry A. Kazakov
2003-12-03 12:49 ` Ludovic Brenta
2003-12-03 13:41 ` Dmitry A. Kazakov
2003-12-03 14:11 ` Ludovic Brenta
2003-12-03 14:45 ` Dmitry A. Kazakov [this message]
2003-12-03 15:44 ` Hyman Rosen
2003-12-03 16:11 ` Dmitry A. Kazakov
2003-12-03 18:20 ` David C. Hoos
[not found] ` <28eb01c3b9ca$25b18870$b101a8c0@sy.com>
2003-12-03 18:35 ` Hyman Rosen
2003-12-03 20:05 ` Randy Brukardt
2003-12-03 20:57 ` Hyman Rosen
2003-12-03 21:16 ` Hyman Rosen
2003-12-03 22:04 ` Pascal Obry
2003-12-03 22:34 ` Hyman Rosen
2003-12-04 1:23 ` Robert I. Eachus
2003-12-04 7:15 ` Hyman Rosen
2003-12-04 17:43 ` Warren W. Gay VE3WWG
2003-12-04 8:55 ` Dmitry A. Kazakov
2003-12-04 19:13 ` Randy Brukardt
2003-12-04 19:29 ` Hyman Rosen
2003-12-04 21:32 ` Robert I. Eachus
2003-12-05 8:43 ` Dmitry A. Kazakov
2003-11-27 22:12 ` Robert I. Eachus
2003-11-28 6:37 ` Simon Wright
2003-11-30 2:51 ` Robert I. Eachus
2003-12-06 7:48 ` Chad Bremmon
2003-12-06 13:33 ` Jeff C,
2003-12-06 22:44 ` Hyman Rosen
2003-12-07 3:02 ` Chad Bremmon
2003-12-07 7:53 ` Hyman Rosen
2003-12-07 15:34 ` James Rogers
2003-12-07 18:30 ` Martin Krischik
2003-12-07 20:25 ` James Rogers
2003-12-08 3:36 ` Hyman Rosen
2003-12-08 4:42 ` Chad Bremmon
2003-12-08 8:42 ` Hyman Rosen
2003-12-08 9:34 ` Dmitry A. Kazakov
2003-12-08 13:25 ` Hyman Rosen
2003-12-08 15:05 ` Dmitry A. Kazakov
2003-12-09 4:38 ` Hyman Rosen
2003-12-09 8:19 ` Dmitry A. Kazakov
2003-12-09 13:29 ` Hyman Rosen
2003-12-09 14:36 ` Dmitry A. Kazakov
2003-12-09 15:05 ` Hyman Rosen
2003-12-09 15:59 ` Dmitry A. Kazakov
2003-12-09 16:41 ` Hyman Rosen
2003-12-10 11:32 ` Dmitry A. Kazakov
2003-12-10 15:27 ` Hyman Rosen
2003-12-10 17:15 ` Dmitry A. Kazakov
2003-12-08 17:55 ` Chad Bremmon
2003-12-08 23:09 ` Hyman Rosen
2003-12-09 8:26 ` Dmitry A. Kazakov
2003-12-08 19:33 ` Martin Krischik
2003-12-09 4:41 ` Hyman Rosen
2003-12-08 17:27 ` Chad Bremmon
2003-12-08 18:44 ` Georg Bauhaus
2003-12-08 19:27 ` Martin Krischik
2003-12-08 19:36 ` Chad Bremmon
2003-12-09 4:43 ` Hyman Rosen
2003-12-08 23:23 ` Hyman Rosen
2003-12-08 19:25 ` Martin Krischik
2003-12-07 21:29 ` Peter C. Chapin
2003-12-08 3:44 ` Hyman Rosen
2003-12-08 3:46 ` Hyman Rosen
2003-12-08 5:54 ` James Rogers
2003-12-08 8:45 ` Hyman Rosen
2003-12-07 17:39 ` Chad Bremmon
2003-12-08 23:39 ` Hyman Rosen
2003-12-09 2:36 ` Chad Bremmon
2003-12-09 4:52 ` Hyman Rosen
2003-12-09 11:24 ` Georg Bauhaus
2003-12-09 18:42 ` Chad Bremmon
2003-12-09 20:11 ` Hyman Rosen
2003-12-08 23:40 ` Hyman Rosen
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox