annotate gcc/ada/libgnat/s-finmas.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- S Y S T E M . F I N A L I Z A T I O N _ M A S T E R S --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 2015-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Ada.Exceptions; use Ada.Exceptions;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 with System.Address_Image;
kono
parents:
diff changeset
35 with System.HTable; use System.HTable;
kono
parents:
diff changeset
36 with System.IO; use System.IO;
kono
parents:
diff changeset
37 with System.Soft_Links; use System.Soft_Links;
kono
parents:
diff changeset
38 with System.Storage_Elements; use System.Storage_Elements;
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 package body System.Finalization_Masters is
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 -- Finalize_Address hash table types. In general, masters are homogeneous
kono
parents:
diff changeset
43 -- collections of controlled objects. Rare cases such as allocations on a
kono
parents:
diff changeset
44 -- subpool require heterogeneous masters. The following table provides a
kono
parents:
diff changeset
45 -- relation between object address and its Finalize_Address routine.
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 type Header_Num is range 0 .. 127;
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 function Hash (Key : System.Address) return Header_Num;
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 -- Address --> Finalize_Address_Ptr
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 package Finalize_Address_Table is new Simple_HTable
kono
parents:
diff changeset
54 (Header_Num => Header_Num,
kono
parents:
diff changeset
55 Element => Finalize_Address_Ptr,
kono
parents:
diff changeset
56 No_Element => null,
kono
parents:
diff changeset
57 Key => System.Address,
kono
parents:
diff changeset
58 Hash => Hash,
kono
parents:
diff changeset
59 Equal => "=");
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 ---------------------------
kono
parents:
diff changeset
62 -- Add_Offset_To_Address --
kono
parents:
diff changeset
63 ---------------------------
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 function Add_Offset_To_Address
kono
parents:
diff changeset
66 (Addr : System.Address;
kono
parents:
diff changeset
67 Offset : System.Storage_Elements.Storage_Offset) return System.Address
kono
parents:
diff changeset
68 is
kono
parents:
diff changeset
69 begin
kono
parents:
diff changeset
70 return System.Storage_Elements."+" (Addr, Offset);
kono
parents:
diff changeset
71 end Add_Offset_To_Address;
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 ------------
kono
parents:
diff changeset
74 -- Attach --
kono
parents:
diff changeset
75 ------------
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 procedure Attach (N : not null FM_Node_Ptr; L : not null FM_Node_Ptr) is
kono
parents:
diff changeset
78 begin
kono
parents:
diff changeset
79 Lock_Task.all;
kono
parents:
diff changeset
80 Attach_Unprotected (N, L);
kono
parents:
diff changeset
81 Unlock_Task.all;
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 -- Note: No need to unlock in case of an exception because the above
kono
parents:
diff changeset
84 -- code can never raise one.
kono
parents:
diff changeset
85 end Attach;
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 ------------------------
kono
parents:
diff changeset
88 -- Attach_Unprotected --
kono
parents:
diff changeset
89 ------------------------
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 procedure Attach_Unprotected
kono
parents:
diff changeset
92 (N : not null FM_Node_Ptr;
kono
parents:
diff changeset
93 L : not null FM_Node_Ptr)
kono
parents:
diff changeset
94 is
kono
parents:
diff changeset
95 begin
kono
parents:
diff changeset
96 L.Next.Prev := N;
kono
parents:
diff changeset
97 N.Next := L.Next;
kono
parents:
diff changeset
98 L.Next := N;
kono
parents:
diff changeset
99 N.Prev := L;
kono
parents:
diff changeset
100 end Attach_Unprotected;
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 ---------------
kono
parents:
diff changeset
103 -- Base_Pool --
kono
parents:
diff changeset
104 ---------------
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 function Base_Pool
kono
parents:
diff changeset
107 (Master : Finalization_Master) return Any_Storage_Pool_Ptr
kono
parents:
diff changeset
108 is
kono
parents:
diff changeset
109 begin
kono
parents:
diff changeset
110 return Master.Base_Pool;
kono
parents:
diff changeset
111 end Base_Pool;
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 -----------------------------------------
kono
parents:
diff changeset
114 -- Delete_Finalize_Address_Unprotected --
kono
parents:
diff changeset
115 -----------------------------------------
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 procedure Delete_Finalize_Address_Unprotected (Obj : System.Address) is
kono
parents:
diff changeset
118 begin
kono
parents:
diff changeset
119 Finalize_Address_Table.Remove (Obj);
kono
parents:
diff changeset
120 end Delete_Finalize_Address_Unprotected;
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 ------------
kono
parents:
diff changeset
123 -- Detach --
kono
parents:
diff changeset
124 ------------
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 procedure Detach (N : not null FM_Node_Ptr) is
kono
parents:
diff changeset
127 begin
kono
parents:
diff changeset
128 Lock_Task.all;
kono
parents:
diff changeset
129 Detach_Unprotected (N);
kono
parents:
diff changeset
130 Unlock_Task.all;
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 -- Note: No need to unlock in case of an exception because the above
kono
parents:
diff changeset
133 -- code can never raise one.
kono
parents:
diff changeset
134 end Detach;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 ------------------------
kono
parents:
diff changeset
137 -- Detach_Unprotected --
kono
parents:
diff changeset
138 ------------------------
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 procedure Detach_Unprotected (N : not null FM_Node_Ptr) is
kono
parents:
diff changeset
141 begin
kono
parents:
diff changeset
142 if N.Prev /= null and then N.Next /= null then
kono
parents:
diff changeset
143 N.Prev.Next := N.Next;
kono
parents:
diff changeset
144 N.Next.Prev := N.Prev;
kono
parents:
diff changeset
145 N.Prev := null;
kono
parents:
diff changeset
146 N.Next := null;
kono
parents:
diff changeset
147 end if;
kono
parents:
diff changeset
148 end Detach_Unprotected;
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 --------------
kono
parents:
diff changeset
151 -- Finalize --
kono
parents:
diff changeset
152 --------------
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 overriding procedure Finalize (Master : in out Finalization_Master) is
kono
parents:
diff changeset
155 Cleanup : Finalize_Address_Ptr;
kono
parents:
diff changeset
156 Curr_Ptr : FM_Node_Ptr;
kono
parents:
diff changeset
157 Ex_Occur : Exception_Occurrence;
kono
parents:
diff changeset
158 Obj_Addr : Address;
kono
parents:
diff changeset
159 Raised : Boolean := False;
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 function Is_Empty_List (L : not null FM_Node_Ptr) return Boolean;
kono
parents:
diff changeset
162 -- Determine whether a list contains only one element, the dummy head
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 -------------------
kono
parents:
diff changeset
165 -- Is_Empty_List --
kono
parents:
diff changeset
166 -------------------
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 function Is_Empty_List (L : not null FM_Node_Ptr) return Boolean is
kono
parents:
diff changeset
169 begin
kono
parents:
diff changeset
170 return L.Next = L and then L.Prev = L;
kono
parents:
diff changeset
171 end Is_Empty_List;
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 -- Start of processing for Finalize
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 begin
kono
parents:
diff changeset
176 Lock_Task.all;
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 -- Synchronization:
kono
parents:
diff changeset
179 -- Read - allocation, finalization
kono
parents:
diff changeset
180 -- Write - finalization
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 if Master.Finalization_Started then
kono
parents:
diff changeset
183 Unlock_Task.all;
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 -- Double finalization may occur during the handling of stand alone
kono
parents:
diff changeset
186 -- libraries or the finalization of a pool with subpools. Due to the
kono
parents:
diff changeset
187 -- potential aliasing of masters in these two cases, do not process
kono
parents:
diff changeset
188 -- the same master twice.
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 return;
kono
parents:
diff changeset
191 end if;
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 -- Lock the master to prevent any allocations while the objects are
kono
parents:
diff changeset
194 -- being finalized. The master remains locked because either the master
kono
parents:
diff changeset
195 -- is explicitly deallocated or the associated access type is about to
kono
parents:
diff changeset
196 -- go out of scope.
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 -- Synchronization:
kono
parents:
diff changeset
199 -- Read - allocation, finalization
kono
parents:
diff changeset
200 -- Write - finalization
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 Master.Finalization_Started := True;
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 while not Is_Empty_List (Master.Objects'Unchecked_Access) loop
kono
parents:
diff changeset
205 Curr_Ptr := Master.Objects.Next;
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 -- Synchronization:
kono
parents:
diff changeset
208 -- Write - allocation, deallocation, finalization
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 Detach_Unprotected (Curr_Ptr);
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 -- Skip the list header in order to offer proper object layout for
kono
parents:
diff changeset
213 -- finalization.
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 Obj_Addr := Curr_Ptr.all'Address + Header_Size;
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 -- Retrieve TSS primitive Finalize_Address depending on the master's
kono
parents:
diff changeset
218 -- mode of operation.
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 -- Synchronization:
kono
parents:
diff changeset
221 -- Read - allocation, finalization
kono
parents:
diff changeset
222 -- Write - outside
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 if Master.Is_Homogeneous then
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 -- Synchronization:
kono
parents:
diff changeset
227 -- Read - finalization
kono
parents:
diff changeset
228 -- Write - allocation, outside
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 Cleanup := Master.Finalize_Address;
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 else
kono
parents:
diff changeset
233 -- Synchronization:
kono
parents:
diff changeset
234 -- Read - finalization
kono
parents:
diff changeset
235 -- Write - allocation, deallocation
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 Cleanup := Finalize_Address_Unprotected (Obj_Addr);
kono
parents:
diff changeset
238 end if;
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 begin
kono
parents:
diff changeset
241 Cleanup (Obj_Addr);
kono
parents:
diff changeset
242 exception
kono
parents:
diff changeset
243 when Fin_Occur : others =>
kono
parents:
diff changeset
244 if not Raised then
kono
parents:
diff changeset
245 Raised := True;
kono
parents:
diff changeset
246 Save_Occurrence (Ex_Occur, Fin_Occur);
kono
parents:
diff changeset
247 end if;
kono
parents:
diff changeset
248 end;
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 -- When the master is a heterogeneous collection, destroy the object
kono
parents:
diff changeset
251 -- - Finalize_Address pair since it is no longer needed.
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 -- Synchronization:
kono
parents:
diff changeset
254 -- Read - finalization
kono
parents:
diff changeset
255 -- Write - outside
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 if not Master.Is_Homogeneous then
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 -- Synchronization:
kono
parents:
diff changeset
260 -- Read - finalization
kono
parents:
diff changeset
261 -- Write - allocation, deallocation, finalization
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 Delete_Finalize_Address_Unprotected (Obj_Addr);
kono
parents:
diff changeset
264 end if;
kono
parents:
diff changeset
265 end loop;
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 Unlock_Task.all;
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 -- If the finalization of a particular object failed or Finalize_Address
kono
parents:
diff changeset
270 -- was not set, reraise the exception now.
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 if Raised then
kono
parents:
diff changeset
273 Reraise_Occurrence (Ex_Occur);
kono
parents:
diff changeset
274 end if;
kono
parents:
diff changeset
275 end Finalize;
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 ----------------------
kono
parents:
diff changeset
278 -- Finalize_Address --
kono
parents:
diff changeset
279 ----------------------
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 function Finalize_Address
kono
parents:
diff changeset
282 (Master : Finalization_Master) return Finalize_Address_Ptr
kono
parents:
diff changeset
283 is
kono
parents:
diff changeset
284 begin
kono
parents:
diff changeset
285 return Master.Finalize_Address;
kono
parents:
diff changeset
286 end Finalize_Address;
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 ----------------------------------
kono
parents:
diff changeset
289 -- Finalize_Address_Unprotected --
kono
parents:
diff changeset
290 ----------------------------------
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 function Finalize_Address_Unprotected
kono
parents:
diff changeset
293 (Obj : System.Address) return Finalize_Address_Ptr
kono
parents:
diff changeset
294 is
kono
parents:
diff changeset
295 begin
kono
parents:
diff changeset
296 return Finalize_Address_Table.Get (Obj);
kono
parents:
diff changeset
297 end Finalize_Address_Unprotected;
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 --------------------------
kono
parents:
diff changeset
300 -- Finalization_Started --
kono
parents:
diff changeset
301 --------------------------
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 function Finalization_Started
kono
parents:
diff changeset
304 (Master : Finalization_Master) return Boolean
kono
parents:
diff changeset
305 is
kono
parents:
diff changeset
306 begin
kono
parents:
diff changeset
307 return Master.Finalization_Started;
kono
parents:
diff changeset
308 end Finalization_Started;
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 ----------
kono
parents:
diff changeset
311 -- Hash --
kono
parents:
diff changeset
312 ----------
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 function Hash (Key : System.Address) return Header_Num is
kono
parents:
diff changeset
315 begin
kono
parents:
diff changeset
316 return
kono
parents:
diff changeset
317 Header_Num
kono
parents:
diff changeset
318 (To_Integer (Key) mod Integer_Address (Header_Num'Range_Length));
kono
parents:
diff changeset
319 end Hash;
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 -----------------
kono
parents:
diff changeset
322 -- Header_Size --
kono
parents:
diff changeset
323 -----------------
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 function Header_Size return System.Storage_Elements.Storage_Count is
kono
parents:
diff changeset
326 begin
kono
parents:
diff changeset
327 return FM_Node'Size / Storage_Unit;
kono
parents:
diff changeset
328 end Header_Size;
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 ----------------
kono
parents:
diff changeset
331 -- Initialize --
kono
parents:
diff changeset
332 ----------------
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 overriding procedure Initialize (Master : in out Finalization_Master) is
kono
parents:
diff changeset
335 begin
kono
parents:
diff changeset
336 -- The dummy head must point to itself in both directions
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 Master.Objects.Next := Master.Objects'Unchecked_Access;
kono
parents:
diff changeset
339 Master.Objects.Prev := Master.Objects'Unchecked_Access;
kono
parents:
diff changeset
340 end Initialize;
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 --------------------
kono
parents:
diff changeset
343 -- Is_Homogeneous --
kono
parents:
diff changeset
344 --------------------
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 function Is_Homogeneous (Master : Finalization_Master) return Boolean is
kono
parents:
diff changeset
347 begin
kono
parents:
diff changeset
348 return Master.Is_Homogeneous;
kono
parents:
diff changeset
349 end Is_Homogeneous;
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 -------------
kono
parents:
diff changeset
352 -- Objects --
kono
parents:
diff changeset
353 -------------
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 function Objects (Master : Finalization_Master) return FM_Node_Ptr is
kono
parents:
diff changeset
356 begin
kono
parents:
diff changeset
357 return Master.Objects'Unrestricted_Access;
kono
parents:
diff changeset
358 end Objects;
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 ------------------
kono
parents:
diff changeset
361 -- Print_Master --
kono
parents:
diff changeset
362 ------------------
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 procedure Print_Master (Master : Finalization_Master) is
kono
parents:
diff changeset
365 Head : constant FM_Node_Ptr := Master.Objects'Unrestricted_Access;
kono
parents:
diff changeset
366 Head_Seen : Boolean := False;
kono
parents:
diff changeset
367 N_Ptr : FM_Node_Ptr;
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 begin
kono
parents:
diff changeset
370 -- Output the basic contents of a master
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 -- Master : 0x123456789
kono
parents:
diff changeset
373 -- Is_Hmgen : TURE <or> FALSE
kono
parents:
diff changeset
374 -- Base_Pool: null <or> 0x123456789
kono
parents:
diff changeset
375 -- Fin_Addr : null <or> 0x123456789
kono
parents:
diff changeset
376 -- Fin_Start: TRUE <or> FALSE
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 Put ("Master : ");
kono
parents:
diff changeset
379 Put_Line (Address_Image (Master'Address));
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 Put ("Is_Hmgen : ");
kono
parents:
diff changeset
382 Put_Line (Master.Is_Homogeneous'Img);
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 Put ("Base_Pool: ");
kono
parents:
diff changeset
385 if Master.Base_Pool = null then
kono
parents:
diff changeset
386 Put_Line ("null");
kono
parents:
diff changeset
387 else
kono
parents:
diff changeset
388 Put_Line (Address_Image (Master.Base_Pool'Address));
kono
parents:
diff changeset
389 end if;
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 Put ("Fin_Addr : ");
kono
parents:
diff changeset
392 if Master.Finalize_Address = null then
kono
parents:
diff changeset
393 Put_Line ("null");
kono
parents:
diff changeset
394 else
kono
parents:
diff changeset
395 Put_Line (Address_Image (Master.Finalize_Address'Address));
kono
parents:
diff changeset
396 end if;
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 Put ("Fin_Start: ");
kono
parents:
diff changeset
399 Put_Line (Master.Finalization_Started'Img);
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 -- Output all chained elements. The format is the following:
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 -- ^ <or> ? <or> null
kono
parents:
diff changeset
404 -- |Header: 0x123456789 (dummy head)
kono
parents:
diff changeset
405 -- | Prev: 0x123456789
kono
parents:
diff changeset
406 -- | Next: 0x123456789
kono
parents:
diff changeset
407 -- V
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 -- ^ - the current element points back to the correct element
kono
parents:
diff changeset
410 -- ? - the current element points back to an erroneous element
kono
parents:
diff changeset
411 -- n - the current element points back to null
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 -- Header - the address of the list header
kono
parents:
diff changeset
414 -- Prev - the address of the list header which the current element
kono
parents:
diff changeset
415 -- points back to
kono
parents:
diff changeset
416 -- Next - the address of the list header which the current element
kono
parents:
diff changeset
417 -- points to
kono
parents:
diff changeset
418 -- (dummy head) - present if dummy head
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 N_Ptr := Head;
kono
parents:
diff changeset
421 while N_Ptr /= null loop -- Should never be null
kono
parents:
diff changeset
422 Put_Line ("V");
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 -- We see the head initially; we want to exit when we see the head a
kono
parents:
diff changeset
425 -- second time.
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 if N_Ptr = Head then
kono
parents:
diff changeset
428 exit when Head_Seen;
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 Head_Seen := True;
kono
parents:
diff changeset
431 end if;
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 -- The current element is null. This should never happen since the
kono
parents:
diff changeset
434 -- list is circular.
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 if N_Ptr.Prev = null then
kono
parents:
diff changeset
437 Put_Line ("null (ERROR)");
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 -- The current element points back to the correct element
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 elsif N_Ptr.Prev.Next = N_Ptr then
kono
parents:
diff changeset
442 Put_Line ("^");
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 -- The current element points to an erroneous element
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 else
kono
parents:
diff changeset
447 Put_Line ("? (ERROR)");
kono
parents:
diff changeset
448 end if;
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 -- Output the header and fields
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 Put ("|Header: ");
kono
parents:
diff changeset
453 Put (Address_Image (N_Ptr.all'Address));
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 -- Detect the dummy head
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 if N_Ptr = Head then
kono
parents:
diff changeset
458 Put_Line (" (dummy head)");
kono
parents:
diff changeset
459 else
kono
parents:
diff changeset
460 Put_Line ("");
kono
parents:
diff changeset
461 end if;
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 Put ("| Prev: ");
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 if N_Ptr.Prev = null then
kono
parents:
diff changeset
466 Put_Line ("null");
kono
parents:
diff changeset
467 else
kono
parents:
diff changeset
468 Put_Line (Address_Image (N_Ptr.Prev.all'Address));
kono
parents:
diff changeset
469 end if;
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 Put ("| Next: ");
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 if N_Ptr.Next = null then
kono
parents:
diff changeset
474 Put_Line ("null");
kono
parents:
diff changeset
475 else
kono
parents:
diff changeset
476 Put_Line (Address_Image (N_Ptr.Next.all'Address));
kono
parents:
diff changeset
477 end if;
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 N_Ptr := N_Ptr.Next;
kono
parents:
diff changeset
480 end loop;
kono
parents:
diff changeset
481 end Print_Master;
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 -------------------
kono
parents:
diff changeset
484 -- Set_Base_Pool --
kono
parents:
diff changeset
485 -------------------
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 procedure Set_Base_Pool
kono
parents:
diff changeset
488 (Master : in out Finalization_Master;
kono
parents:
diff changeset
489 Pool_Ptr : Any_Storage_Pool_Ptr)
kono
parents:
diff changeset
490 is
kono
parents:
diff changeset
491 begin
kono
parents:
diff changeset
492 Master.Base_Pool := Pool_Ptr;
kono
parents:
diff changeset
493 end Set_Base_Pool;
kono
parents:
diff changeset
494
kono
parents:
diff changeset
495 --------------------------
kono
parents:
diff changeset
496 -- Set_Finalize_Address --
kono
parents:
diff changeset
497 --------------------------
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 procedure Set_Finalize_Address
kono
parents:
diff changeset
500 (Master : in out Finalization_Master;
kono
parents:
diff changeset
501 Fin_Addr_Ptr : Finalize_Address_Ptr)
kono
parents:
diff changeset
502 is
kono
parents:
diff changeset
503 begin
kono
parents:
diff changeset
504 -- Synchronization:
kono
parents:
diff changeset
505 -- Read - finalization
kono
parents:
diff changeset
506 -- Write - allocation, outside
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 Lock_Task.all;
kono
parents:
diff changeset
509 Set_Finalize_Address_Unprotected (Master, Fin_Addr_Ptr);
kono
parents:
diff changeset
510 Unlock_Task.all;
kono
parents:
diff changeset
511 end Set_Finalize_Address;
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 --------------------------------------
kono
parents:
diff changeset
514 -- Set_Finalize_Address_Unprotected --
kono
parents:
diff changeset
515 --------------------------------------
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 procedure Set_Finalize_Address_Unprotected
kono
parents:
diff changeset
518 (Master : in out Finalization_Master;
kono
parents:
diff changeset
519 Fin_Addr_Ptr : Finalize_Address_Ptr)
kono
parents:
diff changeset
520 is
kono
parents:
diff changeset
521 begin
kono
parents:
diff changeset
522 if Master.Finalize_Address = null then
kono
parents:
diff changeset
523 Master.Finalize_Address := Fin_Addr_Ptr;
kono
parents:
diff changeset
524 end if;
kono
parents:
diff changeset
525 end Set_Finalize_Address_Unprotected;
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 ----------------------------------------------------
kono
parents:
diff changeset
528 -- Set_Heterogeneous_Finalize_Address_Unprotected --
kono
parents:
diff changeset
529 ----------------------------------------------------
kono
parents:
diff changeset
530
kono
parents:
diff changeset
531 procedure Set_Heterogeneous_Finalize_Address_Unprotected
kono
parents:
diff changeset
532 (Obj : System.Address;
kono
parents:
diff changeset
533 Fin_Addr_Ptr : Finalize_Address_Ptr)
kono
parents:
diff changeset
534 is
kono
parents:
diff changeset
535 begin
kono
parents:
diff changeset
536 Finalize_Address_Table.Set (Obj, Fin_Addr_Ptr);
kono
parents:
diff changeset
537 end Set_Heterogeneous_Finalize_Address_Unprotected;
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 --------------------------
kono
parents:
diff changeset
540 -- Set_Is_Heterogeneous --
kono
parents:
diff changeset
541 --------------------------
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 procedure Set_Is_Heterogeneous (Master : in out Finalization_Master) is
kono
parents:
diff changeset
544 begin
kono
parents:
diff changeset
545 -- Synchronization:
kono
parents:
diff changeset
546 -- Read - finalization
kono
parents:
diff changeset
547 -- Write - outside
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 Lock_Task.all;
kono
parents:
diff changeset
550 Master.Is_Homogeneous := False;
kono
parents:
diff changeset
551 Unlock_Task.all;
kono
parents:
diff changeset
552 end Set_Is_Heterogeneous;
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 end System.Finalization_Masters;