next up previous contents index
Weiter: Andere Arten maschinennaher Hinauf: 14 Low-Level Features Zurück: 14.3 Unkontrollierte Deallokation

14.4 Storage Pool Management

In Ada ist es möglich, die Default-Einstellung für die Speicher-Allokation und -Deallokation auf dem Heap durch eigene Algorithmen zu ersetzen. Für jeden Access-Typ gibt es einen eigenen Storage Pool,  der für jenen Speicherbereich steht, wo Objekte dieses Typs angelegt werden. Ein Storage Pool kann aber auch dazu genutzt werden, daß mehrere Access-Typen auf ihm angelegt werden. So sind zum Beispiel alle von einen Vatertyp abgeleiteten Typen ein und demselben Storage Pool zugeordnet.

Das Paket System.Storage_Pools bietet die Möglichkeit, von dem abstrakten Typ Root_Storage_Pool eigene Storage Pools abzuleiten. Ein Beispiel ist:

with System.Storage_Pools;
with Sytsem.Storage_Elements; use System;
package Mark_Release_Storage is

type Mark_Release_Pool(Size: Storage_Elements.Storage_Count) is
new Storage_Pools.Root_Storage_Pool with private;

type Pool_Mark is limited private;

-controlledoperations
procedure Initialize(Pool: in out Mark_Release_Pool);

procedure Finalize(Pool: in out Mark_Release_Pool);

-storagepooloperations
procedure Allocate(
Pool: in out Mark_Release_Pool;
Storage_Address: out Address;
Size_In_Storage_Elements: in Storage_Elements.Storage_Counts;
Alignment: in Storage_Elements.Storage_Counts);

procedure Deallocate(
Pool: in out Mark_Release_Pool;
Storage_Address: in Address;
Size_In_Storage_Elements: in Storage_Elements.Storage_Counts;
Alignment: in Storage_Elements.Storage_Counts);

function Storage_Size(Pool: Mark_Release_Pool)
return Storage_Elements.Storage_Count;

-Mark_Release_Pool-specificoperations
procedure Set_Mark(
Pool: in Mark_Release_Pool;
Mark: out Pool_Mark);
-markiertdenmomentanenZustanddesPools,umihn
-spaeterwiederherstellenzukoennen

procedure Release_To_Mark(
Pool: in out Mark_Release_Pool;
Mark: in Pool_Mark);
-dergesamteSpeicher,derseitdemangegebenenMark
-belegtwurde,wirdfreigegeben

private
...
end Mark_Release_Storage;

Es ist zu beachten, daß die Prozeduren Allocate und Deallocate implizit aufgerufen werden, wenn ein entsprechendes Objekt angelegt werden (new ...) oder zerstört werden soll (Unchecked_Deallocation).

Um nun dieses Paket zu verwenden, müssen wir zunächst so einen Pool anlegen und ihn dem entsprechenden Access-Typ zuordnen. Das geschieht etwa so:

use Mark_Release_Storage;
Big_Pool: Mark_Release_Pool(50_000);

type Some_Type is ...;
type Some_Access is access Some_Type;
for Some_Access'STORAGE_POOL use Big_Pool;



Johann Blieberger
Wed Feb 11 09:58:52 MET 1998