1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- SYSTEM.STORAGE_POOLS.SUBPOOLS.FINALIZATION --
9 -- Copyright (C) 2011-2014, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
30 ------------------------------------------------------------------------------
32 with Ada
.Unchecked_Deallocation
;
34 with System
.Finalization_Masters
; use System
.Finalization_Masters
;
36 package body System
.Storage_Pools
.Subpools
.Finalization
is
38 -----------------------------
39 -- Finalize_And_Deallocate --
40 -----------------------------
42 procedure Finalize_And_Deallocate
(Subpool
: in out Subpool_Handle
) is
43 procedure Free
is new Ada
.Unchecked_Deallocation
(SP_Node
, SP_Node_Ptr
);
46 -- Do nothing if the subpool was never created or never used. The latter
47 -- case may arise with an array of subpool implementations.
50 or else Subpool
.Owner
= null
51 or else Subpool
.Node
= null
56 -- Clean up all controlled objects chained on the subpool's master
58 Finalize
(Subpool
.Master
);
60 -- Remove the subpool from its owner's list of subpools
62 Detach
(Subpool
.Node
);
64 -- Destroy the associated doubly linked list node which was created in
65 -- Set_Pool_Of_Subpools.
69 -- Dispatch to the user-defined implementation of Deallocate_Subpool. It
70 -- is important to first set Subpool.Owner to null, because RM-13.11.5
71 -- requires that "The subpool no longer belongs to any pool" BEFORE
72 -- calling Deallocate_Subpool. The actual dispatching call required is:
74 -- Deallocate_Subpool(Pool_of_Subpool(Subpool).all, Subpool);
76 -- but that can't be taken literally, because Pool_of_Subpool will
80 Owner
: constant Any_Storage_Pool_With_Subpools_Ptr
:= Subpool
.Owner
;
82 Subpool
.Owner
:= null;
83 Deallocate_Subpool
(Owner
.all, Subpool
);
87 end Finalize_And_Deallocate
;
89 end System
.Storage_Pools
.Subpools
.Finalization
;