From: James Rogers <jrogers@velveeta.apdev.cs.mci.com>
Subject: Re: Garbage Collection in Ada
Date: 1996/10/30
Date: 1996-10-30T00:00:00+00:00 [thread overview]
Message-ID: <3277815F.41C6@velveeta.apdev.cs.mci.com> (raw)
In-Reply-To: 199610181934142408603@dialup101-3-15.swipnet.se
Jonas Nygren wrote:
>
> To me GC solves the problem of deallocation when there are two or more
> references
> to the same object. Without GC this is a difficult problem to solve,
> specially so
> in very large programs, where you have the problem of possible dangling
> pointers.
>
> I have tried Java a bit and recommend it to NO-GC advocates, it is
> rather
> refreshing not to have to think about deallocation. You should try it.
>
> /jonas
The solution in non-garbage collection implementations is to use
"smart pointers" or reference counting. An excellent example of
how this is done in Ada comes from John English's new textbook
"Ada 95: The Craft of Object-Oriented Programming"
His example is:
----------------------------------------------------------------------------
--
-- File: je.ads
-- Purpose: Ultimate parent of all example packages (specification)
-- Author: John English (je@brighton.ac.uk)
--
-- This code is from "Ada 95: The Craft of Object-Oriented
Programming"
-- by John English (Prentice Hall 1997). Copyright (c) John English.
-- Permission is granted to copy and distribute this file for
-- non-commercial use only.
--
----------------------------------------------------------------------------
package JE is
-- an empty package!
end JE;
----------------------------------------------------------------------------
--
-- File: je-pointers.ads
-- Purpose: Generic "smart pointers" package (specification)
-- Author: John English (je@brighton.ac.uk)
--
-- This code is from "Ada 95: The Craft of Object-Oriented
Programming"
-- by John English (Prentice Hall 1997). Copyright (c) John English.
-- Permission is granted to copy and distribute this file for
-- non-commercial use only.
--
----------------------------------------------------------------------------
with Ada.Finalization;
generic
type Item_Type(<>) is limited private;
type Access_Type is access Item_Type;
package JE.Pointers is
type Pointer_Type is private;
function Pointer (Value : Access_Type) return Pointer_Type;
function Value (Pointer : Pointer_Type) return Access_Type;
private
type Reference_Counted_Object is
record
Value : Access_Type;
Count : Natural;
end record;
type Reference_Counted_Pointer is access Reference_Counted_Object;
type Pointer_Type is new Ada.Finalization.Controlled with
record
Pointer : Reference_Counted_Pointer;
end record;
procedure Finalize (Object : in out Pointer_Type);
procedure Adjust (Object : in out Pointer_Type);
end JE.Pointers;
----------------------------------------------------------------------------
--
-- File: je-pointers.adb
-- Purpose: Smart pointers package (body)
-- Author: John English (je@brighton.ac.uk)
--
-- This code is from "Ada 95: The Craft of Object-Oriented
Programming"
-- by John English (Prentice Hall 1997). Copyright (c) John English.
-- Permission is granted to copy and distribute this file for
-- non-commercial use only.
--
----------------------------------------------------------------------------
with Ada.Unchecked_Deallocation, Ada.Text_IO;
package body JE.Pointers is
procedure Delete_Item is
new Ada.Unchecked_Deallocation (Item_Type, Access_Type);
procedure Delete_Pointer is
new Ada.Unchecked_Deallocation
(Reference_Counted_Object,
Reference_Counted_Pointer);
function Pointer (Value : Access_Type) return Pointer_Type is
Object : Pointer_Type;
begin
if Object.Pointer /= null then
Delete_Item (Object.Pointer.Value);
else
Object.Pointer := new Reference_Counted_Object;
end if;
Object.Pointer.all := (Value => Value, Count => 1);
return Object;
end Pointer;
function Value (Pointer : Pointer_Type) return Access_Type is
begin
if Pointer.Pointer = null then
return null;
else
return Pointer.Pointer.Value;
end if;
end Value;
procedure Finalize (Object : in out Pointer_Type) is
begin
Ada.Text_IO.Put ("Finalising pointer...");
if Object.Pointer /= null then
Object.Pointer.Count := Object.Pointer.Count - 1;
if Object.Pointer.Count = 0 then
Ada.Text_IO.Put (" reference count = 0, deleting");
Delete_Item (Object.Pointer.Value);
Delete_Pointer (Object.Pointer);
else
Ada.Text_IO.Put (" reference count > 0");
end if;
else
Ada.Text_IO.Put (" null, ignored");
end if;
Ada.Text_IO.New_Line;
end Finalize;
procedure Adjust (Object : in out Pointer_Type) is
begin
Ada.Text_IO.Put ("Copying pointer...");
if Object.Pointer /= null then
Object.Pointer.Count := Object.Pointer.Count + 1;
else
Ada.Text_IO.Put (" null, ignored");
end if;
Ada.Text_IO.New_Line;
end Adjust;
end JE.Pointers;
--
Jim Rogers
*************************************************************
Team Ada
next prev parent reply other threads:[~1996-10-30 0:00 UTC|newest]
Thread overview: 126+ messages / expand[flat|nested] mbox.gz Atom feed top
1996-10-13 0:00 Garbage Collection in Ada Jonas Nygren
1996-10-13 0:00 ` Robert Dewar
1996-10-13 0:00 ` Lars Farm
1996-10-13 0:00 ` Robert Dewar
[not found] ` <19961014115513529729@dialup105-2-16.swipnet.se>
1996-10-16 0:00 ` Robert Dewar
1996-10-16 0:00 ` Lars Farm
1996-10-16 0:00 ` Robert Dewar
1996-10-16 0:00 ` Hans-Juergen Boehm
1996-10-17 0:00 ` Robert Dewar
1996-10-17 0:00 ` Hans-Juergen Boehm
1996-10-17 0:00 ` Robert A Duff
1996-10-17 0:00 ` Larry Kilgallen
1996-10-17 0:00 ` Hans-Juergen Boehm
1996-10-17 0:00 ` Lars Farm
1996-10-23 0:00 ` Robert Dewar
1996-10-16 0:00 ` Hans-Juergen Boehm
1996-10-16 0:00 ` Robert Dewar
1996-10-16 0:00 ` Hans-Juergen Boehm
1996-10-17 0:00 ` Robert Dewar
1996-10-17 0:00 ` Hans-Juergen Boehm
1996-10-17 0:00 ` Robert Dewar
1996-10-13 0:00 ` Larry Kilgallen
1996-10-14 0:00 ` John Howard
1996-10-15 0:00 ` Lars Farm
1996-10-15 0:00 ` Robert A Duff
1996-10-15 0:00 ` Robert Dewar
1996-10-15 0:00 ` Lars Farm
1996-10-15 0:00 ` Hans-Juergen Boehm
1996-10-17 0:00 ` Thomas Kendelbacher
1996-10-17 0:00 ` Robert Dewar
1996-10-23 0:00 ` Richard A. O'Keefe
1996-10-23 0:00 ` Larry Kilgallen
1996-10-14 0:00 ` Robert A Duff
1996-10-14 0:00 ` Lars Farm
1996-10-15 0:00 ` Robert A Duff
1996-10-16 0:00 ` Lars Farm
1996-10-16 0:00 ` Robert Dewar
1996-10-17 0:00 ` Robert A Duff
1996-10-19 0:00 ` Richard Kenner
1996-10-19 0:00 ` Robert Dewar
1996-10-19 0:00 ` Lars Farm
1996-10-20 0:00 ` Robert Dewar
1996-10-20 0:00 ` Robert A Duff
1996-10-20 0:00 ` Robert Dewar
1996-10-21 0:00 ` Lars Farm
1996-10-21 0:00 ` Robert Dewar
1996-10-21 0:00 ` Lars Farm
1996-10-21 0:00 ` Geert Bosch
1996-10-21 0:00 ` Hans-Juergen Boehm
1996-10-23 0:00 ` Fergus Henderson
1996-10-24 0:00 ` Richard A. O'Keefe
1996-10-20 0:00 ` Robert A Duff
1996-10-20 0:00 ` Robert Dewar
1996-10-21 0:00 ` Hans-Juergen Boehm
1996-10-21 0:00 ` Robert Dewar
1996-10-15 0:00 ` Hans-Juergen Boehm
1996-10-15 0:00 ` Keith Thompson
1996-10-14 0:00 ` Jon S Anthony
1996-10-15 0:00 ` Robert Dewar
1996-10-15 0:00 ` Robert I. Eachus
1996-10-15 0:00 ` Robert Dewar
1996-10-16 0:00 ` whiting_ms@corning.com (Matt Whiting)
1996-10-16 0:00 ` Robert Dewar
1996-10-17 0:00 ` John Howard
1996-10-17 0:00 ` Robert Dewar
1996-10-18 0:00 ` Lars Farm
1996-10-20 0:00 ` Robert A Duff
1996-10-18 0:00 ` Hans-Juergen Boehm
1996-10-18 0:00 ` Lars Farm
1996-10-19 0:00 ` Robert Dewar
1996-10-20 0:00 ` Lars Farm
1996-10-21 0:00 ` Robert Dewar
1996-10-22 0:00 ` Lars Farm
1996-10-21 0:00 ` Nicolay Belofastow
1996-10-21 0:00 ` Robert Dewar
1996-10-20 0:00 ` Robert A Duff
1996-10-20 0:00 ` Robert Dewar
1996-10-22 0:00 ` Mitch Gart
1996-10-23 0:00 ` Hans-Juergen Boehm
1996-10-27 0:00 ` Richard Riehle
1996-10-23 0:00 ` Fergus Henderson
1996-10-29 0:00 ` Jon S Anthony
1996-10-30 0:00 ` Jon S Anthony
1996-10-30 0:00 ` James Rogers [this message]
1996-10-30 0:00 ` Brian Rogoff
1996-10-30 0:00 ` Jonas Nygren
1996-10-15 0:00 ` Hannes Haug
1996-10-16 0:00 ` Jon S Anthony
1996-10-17 0:00 ` Robert Dewar
1996-10-16 0:00 ` Jon S Anthony
1996-10-16 0:00 ` Ole-Hjalmar Kristensen FOU.TD/DELAB
1996-10-16 0:00 ` Robert Dewar
1996-10-16 0:00 ` Jon S Anthony
1996-10-16 0:00 ` Jon S Anthony
1996-10-17 0:00 ` Robert I. Eachus
1996-10-17 0:00 ` Robert Dewar
1996-10-17 0:00 ` Richard Kenner
1996-10-17 0:00 ` Rick Hudson
1996-10-17 0:00 ` Hans-Juergen Boehm
1996-10-18 0:00 ` Jon S Anthony
1996-10-23 0:00 ` Robert Dewar
1996-10-18 0:00 ` Rick Hudson
1996-10-18 0:00 ` Jon S Anthony
1996-10-18 0:00 ` Robert Dewar
1996-10-21 0:00 ` Laurent Pautet
1996-10-21 0:00 ` Jon S Anthony
1996-10-22 0:00 ` Jon S Anthony
1996-10-22 0:00 ` Tapani Rundgren
1996-10-23 0:00 ` Jon S Anthony
1996-10-24 0:00 ` Mitch Gart
1996-10-24 0:00 ` Robert I. Eachus
1996-10-24 0:00 ` Hans-Juergen Boehm
1996-10-25 0:00 ` Jon S Anthony
1996-10-28 0:00 ` Robert I. Eachus
1996-10-29 0:00 ` Hans-Juergen Boehm
[not found] <01bbc6a3$4cf03480$829d6482@joy.ericsson.se>
1996-10-31 0:00 ` Mitch Gart
1996-10-31 0:00 ` Jonas Nygren
1996-11-03 0:00 ` Matthew Heaney
1996-11-06 0:00 ` Robert A Duff
1996-11-06 0:00 ` Norman H. Cohen
1996-11-01 0:00 ` Jon S Anthony
1996-11-06 0:00 ` Brian Rogoff
1996-11-07 0:00 ` Tucker Taft
-- strict thread matches above, loose matches on Subject: below --
1996-11-02 0:00 Jon S Anthony
1996-10-22 0:00 Brian Rogoff
1996-10-11 0:00 C++ Standardization (was: Once again, Ada absent from DoD SBIR solicitation) Dave Wood
1996-10-17 0:00 ` Garbage Collection in Ada Thomas Kendelbacher
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox