1 ------------------------------------------------------------------------------
3 -- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
5 -- S Y S T E M . T A S K I N G . T A S K _ A T T R I B U T E S --
9 -- Copyright (C) 2014-2015, 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 -- GNARL was developed by the GNARL team at Florida State University. --
28 -- Extensive contributions were provided by Ada Core Technologies, Inc. --
30 ------------------------------------------------------------------------------
32 with System
.Parameters
; use System
.Parameters
;
33 with System
.Tasking
.Initialization
; use System
.Tasking
.Initialization
;
34 with System
.Task_Primitives
.Operations
;
36 package body System
.Tasking
.Task_Attributes
is
38 package STPO
renames System
.Task_Primitives
.Operations
;
40 type Index_Info
is record
42 -- Used is True if a given index is used by an instantiation of
43 -- Ada.Task_Attributes, False otherwise.
45 Require_Finalization
: Boolean;
46 -- Require_Finalization is True if the attribute requires finalization
49 Index_Array
: array (1 .. Max_Attribute_Count
) of Index_Info
:=
50 (others => (False, False));
52 -- Note that this package will use an efficient implementation with no
53 -- locks and no extra dynamic memory allocation if Attribute can fit in a
54 -- System.Address type and Initial_Value is 0 (or null for an access type).
56 function Next_Index
(Require_Finalization
: Boolean) return Integer is
57 Self_Id
: constant Task_Id
:= STPO
.Self
;
62 for J
in Index_Array
'Range loop
63 if not Index_Array
(J
).Used
then
64 Index_Array
(J
).Used
:= True;
65 Index_Array
(J
).Require_Finalization
:= Require_Finalization
;
66 Task_Unlock
(Self_Id
);
71 Task_Unlock
(Self_Id
);
72 raise Storage_Error
with "Out of task attributes";
79 procedure Finalize
(Index
: Integer) is
80 Self_Id
: constant Task_Id
:= STPO
.Self
;
82 pragma Assert
(Index
in Index_Array
'Range);
84 Index_Array
(Index
).Used
:= False;
85 Task_Unlock
(Self_Id
);
88 --------------------------
89 -- Require_Finalization --
90 --------------------------
92 function Require_Finalization
(Index
: Integer) return Boolean is
94 pragma Assert
(Index
in Index_Array
'Range);
95 return Index_Array
(Index
).Require_Finalization
;
96 end Require_Finalization
;
98 end System
.Tasking
.Task_Attributes
;