1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT COMPILER COMPONENTS                         --
4--                                                                          --
5--                 S Y S T E M . S T O R A G E _ P O O L S                  --
6--                                                                          --
7--                                 S p e c                                  --
8--                                                                          --
9--          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
10--                                                                          --
11-- This specification is derived from the Ada Reference Manual for use with --
12-- GNAT. The copyright notice above, and the license provisions that follow --
13-- apply solely to the  contents of the part following the private keyword. --
14--                                                                          --
15-- GNAT is free software;  you can  redistribute it  and/or modify it under --
16-- terms of the  GNU General Public License as published  by the Free Soft- --
17-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
18-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
19-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
20-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
21--                                                                          --
22-- As a special exception under Section 7 of GPL version 3, you are granted --
23-- additional permissions described in the GCC Runtime Library Exception,   --
24-- version 3.1, as published by the Free Software Foundation.               --
25--                                                                          --
26-- You should have received a copy of the GNU General Public License and    --
27-- a copy of the GCC Runtime Library Exception along with this program;     --
28-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
29-- <http://www.gnu.org/licenses/>.                                          --
30--                                                                          --
31-- GNAT was originally developed  by the GNAT team at  New York University. --
32-- Extensive contributions were provided by Ada Core Technologies Inc.      --
33--                                                                          --
34------------------------------------------------------------------------------
35
36with Ada.Finalization;
37with System.Storage_Elements;
38
39package System.Storage_Pools is
40   pragma Preelaborate;
41
42   type Root_Storage_Pool is abstract
43     new Ada.Finalization.Limited_Controlled with private;
44
45   procedure Allocate
46     (Pool                     : in out Root_Storage_Pool;
47      Storage_Address          : out System.Address;
48      Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
49      Alignment                : System.Storage_Elements.Storage_Count)
50   is abstract;
51
52   procedure Deallocate
53     (Pool                     : in out Root_Storage_Pool;
54      Storage_Address          : System.Address;
55      Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
56      Alignment                : System.Storage_Elements.Storage_Count)
57   is abstract;
58
59   function Storage_Size
60     (Pool : Root_Storage_Pool)
61      return System.Storage_Elements.Storage_Count
62   is abstract;
63
64private
65   type Root_Storage_Pool is abstract
66     new Ada.Finalization.Limited_Controlled with null record;
67
68   type Root_Storage_Pool_Ptr is access all Root_Storage_Pool'Class;
69   for Root_Storage_Pool_Ptr'Storage_Size use 0;
70   --  Type of the BIP_Storage_Pool extra parameter (see Exp_Ch6). The
71   --  Storage_Size clause is necessary, because otherwise we have a
72   --  chicken&egg problem; we can't be creating collection finalization code
73   --  in this low-level package, because that involves Pool_Global, which
74   --  imports this package.
75
76   --  ??? Are these two still needed? It might be possible to use Subpools.
77   --  Allocate_Any_Controlled / Deallocate_Any_Controlled for non-controlled
78   --  objects.
79
80   --  The following two procedures support the use of class-wide pool
81   --  objects in storage pools. When a local type is given a class-wide
82   --  storage pool, allocation and deallocation for the type must dispatch
83   --  to the operation of the specific pool, which is achieved by a call
84   --  to these procedures. (When the pool type is specific, the back-end
85   --  generates a call to the statically identified operation of the type).
86
87   procedure Allocate_Any
88    (Pool                     : in out Root_Storage_Pool'Class;
89     Storage_Address          : out System.Address;
90     Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
91     Alignment                : System.Storage_Elements.Storage_Count);
92
93   procedure Deallocate_Any
94    (Pool                     : in out Root_Storage_Pool'Class;
95     Storage_Address          : System.Address;
96     Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
97     Alignment                : System.Storage_Elements.Storage_Count);
98
99end System.Storage_Pools;
100