summaryrefslogtreecommitdiffstats
path: root/gcc/ada/s-thread.ads
blob: f1606f1b808396f9552d17baafdf9766351e2013 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                       S Y S T E M . T H R E A D S                        --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 1992-2003 Free Software Foundation, Inc.          --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
-- MA 02111-1307, USA.                                                      --
--                                                                          --
-- As a special exception,  if other files  instantiate  generics from this --
-- unit, or you link  this unit with other files  to produce an executable, --
-- this  unit  does not  by itself cause  the resulting  executable  to  be --
-- covered  by the  GNU  General  Public  License.  This exception does not --
-- however invalidate  any other reasons why  the executable file  might be --
-- covered by the  GNU Public License.                                      --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

--  This package provides facilities to register a thread to the runtime,
--  and allocate its task specific datas.

--  pragma Thread_Body is currently supported for:
--  VxWorks AE653 with the restricted / cert runtime

with Ada.Exceptions;
--  used for Exception_Occurrence

with System.Soft_Links;
--  used for TSD

package System.Threads is

   subtype EO is Ada.Exceptions.Exception_Occurrence;

   subtype EOA is Ada.Exceptions.Exception_Occurrence_Access;

   type ATSD is limited private;
   --  Type of the Ada thread specific data. It contains datas needed
   --  by the GNAT runtime.

   type ATSD_Access is access ATSD;

   --  Get/Set for the attributes of the current thread

   function  Get_Jmpbuf_Address return  Address;
   pragma Inline (Get_Jmpbuf_Address);

   procedure Set_Jmpbuf_Address (Addr : Address);
   pragma Inline (Get_Jmpbuf_Address);

   function  Get_Sec_Stack_Addr return  Address;
   pragma Inline (Get_Sec_Stack_Addr);

   procedure Set_Sec_Stack_Addr (Addr : Address);
   pragma Inline (Set_Sec_Stack_Addr);

   function Get_Current_Excep return EOA;
   pragma Inline (Get_Current_Excep);

   --------------------------
   -- Thread Body Handling --
   --------------------------

   --  The subprograms in this section are called by the expansion of a
   --  subprogram body to which a Thread_Body pragma has been applied:

   --  Given a subprogram body

   --     procedure xyz (params ....) is    -- can also be a function
   --       <user declarations>
   --     begin
   --       <user statements>
   --     <user exception handlers>
   --     end xyz;

   --  The expansion resulting from use of the Thread_Body pragma is:

   --     procedure xyz (params ...) is

   --       _Secondary_Stack : aliased
   --          Storage_Elements.Storage_Array
   --            (1 .. Storage_Offset (Sec_Stack_Size));
   --       for _Secondary_Stack'Alignment use Standard'Maximum_Alignment;

   --       _Process_ATSD : aliased System.Threads.ATSD;

   --     begin
   --        System.Threads.Thread_Body_Enter;
   --          (_Secondary_Stack'Address,
   --           _Secondary_Stack'Length,
   --           _Process_ATSD'Address);

   --        declare
   --           <user declarations>
   --        begin
   --           <user statements>
   --        <user exception handlers>
   --        end;

   --       System.Threads.Thread_Body_Leave;

   --     exception
   --        when E : others =>
   --          System.Threads.Thread_Body_Exceptional_Exit (E);
   --     end;

   --  Note the exception handler is omitted if pragma Restriction
   --  No_Exception_Handlers is currently active.

   --  Note: the secondary stack size (Sec_Stack_Size) comes either from
   --  the pragma, if specified, or is the default value taken from
   --  the declaration in System.Secondary_Stack.

   procedure Thread_Body_Enter
     (Sec_Stack_Address    : System.Address;
      Sec_Stack_Size       : Natural;
      Process_ATSD_Address : System.Address);
   --  Enter thread body, see above for details

   procedure Thread_Body_Leave;
   --  Leave thread body (normally), see above for details

   procedure Thread_Body_Exceptional_Exit
     (EO : Ada.Exceptions.Exception_Occurrence);
   --  Leave thread body (abnormally on exception), see above for details

private

   type ATSD is new System.Soft_Links.TSD;

end System.Threads;
OpenPOWER on IntegriCloud