Boehm-Demers-Weiser conservative garbage collector
AdaCL features a binding to the Boehm-Demers-Weiser conservative garbage collector. A garbage collector will automatically reclaim unused memory so that there is no need for
Ada.Unchecked_Deallocation. Mind you, AdaCL itself frees all memory allocated.
There is much discussion about garbage collectors and whether they are really needed in Ada. Personally I think that some the original designer actually wanted a garbage collector. Read the following chapters of the reference manual:
Sadly almost no Ada implementors ever made it to actually implement a garbage collector. For comparison: most other modern languages (java, modula-3, eiffel, c#, managed c++, d, objective-pascal) now have one.
Luckily the GCC Team designed a language independent garbage collector usable for all GCC languages - and that includes GNAT.
Often it is suggested to use a no operation for a garbage collecting storage pool. But after looking at the relevant chapter of the reference manual I think this is not what the Ada designers wanted:
If you call unchecked de-allocation then memory is freed unconditionally and access types still pointing to that memory will be left dangling.
If you make an unchecked de-allocation on an access to a class wide type then all possible types should be garbage collected, or not - otherwise garbage collected memory will be freed with a normal free or vice versa. As it says: it is unchecked de-allocation and there are a lot of ways to shoot yourself in the foot.
Relying on a garbage collector gives finalisation a new interesting twist. That is, you don't know when finalisation is called. And sometimes it is not called at all. First Problem of course is that the reference manual is a little vague on how to implement finalisation:
The Boehm-Demers-Weiser conservative garbage collector is used for Java as well so on that end everything needed is in place. On the Ada end one need to rely on GNAT internals to implement finalisation. See
System.Finalization_Implementation for details.
What if I don't want a garbage collector?
Then open the Scripts\*.gnatprep for your operating system and change GC_Active to false.
How to use
The Garbage Collector can be use like any other Storage Pool. Since it make no difference how often the Storage Pool types are instantiated a convenience instance is provided within the packages. There are several different Storage Pools for different purposes provided within the
gc and Linux
As one might expect the Linux implementation works “out of the box”.
gc and NT
The Windows implementation doesn't work, so it has been disabled in Scripts\NT.gnatprep. The problem is that Windows GNAT is based on MinGW and not cygwin but the Windows implementation of the garbage collector needs cygwin.
Copy gc.a to libgc.a if you want to try it anyway. For example if you have a newer version of MinGW.
gc and OS/2
Apart from a strange Warning, the GC for OS/2 works fine. However the OS2_makefile of the for the Boehm-Demers-Weiser conservative garbage collector is outdated. Write a Support Request on the AdaCL Project Page if you need help.
A copy of gc.a to libgc.a is not needed.