1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- S Y S T E M . T H R E A D S --
9 -- Copyright (C) 1992-2003 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 2, 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. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING. If not, write --
19 -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
20 -- MA 02111-1307, USA. --
22 -- As a special exception, if other files instantiate generics from this --
23 -- unit, or you link this unit with other files to produce an executable, --
24 -- this unit does not by itself cause the resulting executable to be --
25 -- covered by the GNU General Public License. This exception does not --
26 -- however invalidate any other reasons why the executable file might be --
27 -- covered by the GNU Public License. --
29 -- GNAT was originally developed by the GNAT team at New York University. --
30 -- Extensive contributions were provided by Ada Core Technologies Inc. --
32 ------------------------------------------------------------------------------
34 -- This package provides facilities to register a thread to the runtime,
35 -- and allocate its task specific datas.
39 package System.Threads is
41 subtype EO is Ada.Exceptions.Exception_Occurrence;
43 subtype EOA is Ada.Exceptions.Exception_Occurrence_Access;
45 type ATSD is limited private;
46 -- Type of the Ada thread specific data. It contains datas needed
47 -- by the GNAT runtime.
49 type ATSD_Access is access ATSD;
51 -- Get/Set for the attributes of the current thread
53 function Get_Jmpbuf_Address return Address;
54 pragma Inline (Get_Jmpbuf_Address);
56 procedure Set_Jmpbuf_Address (Addr : Address);
57 pragma Inline (Get_Jmpbuf_Address);
59 function Get_Sec_Stack_Addr return Address;
60 pragma Inline (Get_Sec_Stack_Addr);
62 procedure Set_Sec_Stack_Addr (Addr : Address);
63 pragma Inline (Set_Sec_Stack_Addr);
65 function Get_Current_Excep return EOA;
66 pragma Inline (Get_Current_Excep);
68 --------------------------
69 -- Thread Body Handling --
70 --------------------------
72 -- The subprograms in this section are called by the expansion of a
73 -- subprogram body to which a Thread_Body pragma has been applied:
75 -- Given a subprogram body
77 -- procedure xyz (params ....) is -- can also be a function
78 -- <user declarations>
81 -- <user exception handlers>
84 -- The expansion resulting from use of the Thread_Body pragma is:
86 -- procedure xyz (params ...) is
88 -- _Secondary_Stack : aliased
89 -- Storage_Elements.Storage_Array
90 -- (1 .. Storage_Offset (Sec_Stack_Size));
91 -- for _Secondary_Stack'Alignment use Standard'Maximum_Alignment;
93 -- _Process_ATSD : aliased System.Threads.ATSD;
96 -- System.Threads.Thread_Body_Enter;
97 -- (_Secondary_Stack'Address,
98 -- _Secondary_Stack'Length,
99 -- _Process_ATSD'Address);
102 -- <user declarations>
105 -- <user exception handlers>
108 -- System.Threads.Thread_Body_Leave;
111 -- when E : others =>
112 -- System.Threads.Thread_Body_Exceptional_Exit (E);
115 -- Note the exception handler is omitted if pragma Restriction
116 -- No_Exception_Handlers is currently active.
118 -- Note: the secondary stack size (Sec_Stack_Size) comes either from
119 -- the pragma, if specified, or is the default value taken from
120 -- the declaration in System.Secondary_Stack.
122 procedure Thread_Body_Enter
123 (Sec_Stack_Address : System.Address;
124 Sec_Stack_Size : Natural;
125 Process_ATSD_Address : System.Address);
126 -- Enter thread body, see above for details
128 procedure Thread_Body_Leave;
129 -- Leave thread body (normally), see above for details
131 procedure Thread_Body_Exceptional_Exit
132 (EO : Ada.Exceptions.Exception_Occurrence);
133 -- Leave thread body (abnormally on exception), see above for details
137 ------------------------
138 -- Task Specific Data --
139 ------------------------
141 type ATSD is limited record
142 Jmpbuf_Address : Address := Null_Address;
143 -- Address of jump buffer used to store the address of the
144 -- current longjmp/setjmp buffer for exception management.
145 -- These buffers are threaded into a stack, and the address
146 -- here is the top of the stack. A null address means that
147 -- no exception handler is currently active.
149 Sec_Stack_Addr : Address := Null_Address;
150 -- Address of currently allocated secondary stack
152 Current_Excep : aliased EO;
153 -- Exception occurrence that contains the information for the
154 -- current exception. Note that any exception in the same task
155 -- destroys this information, so the data in this variable must
156 -- be copied out before another exception can occur.