aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/s-thread.ads
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/s-thread.ads')
-rw-r--r--gcc/ada/s-thread.ads93
1 files changed, 73 insertions, 20 deletions
diff --git a/gcc/ada/s-thread.ads b/gcc/ada/s-thread.ads
index 6bf6aafb568..f1606f1b808 100644
--- a/gcc/ada/s-thread.ads
+++ b/gcc/ada/s-thread.ads
@@ -34,7 +34,14 @@
-- 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
@@ -48,7 +55,7 @@ package System.Threads is
type ATSD_Access is access ATSD;
- -- Get/Set for the attributes of the current thread.
+ -- Get/Set for the attributes of the current thread
function Get_Jmpbuf_Address return Address;
pragma Inline (Get_Jmpbuf_Address);
@@ -65,29 +72,75 @@ package System.Threads is
function Get_Current_Excep return EOA;
pragma Inline (Get_Current_Excep);
-private
+ --------------------------
+ -- 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;
- ------------------------
- -- Task Specific Data --
- ------------------------
+ -- _Process_ATSD : aliased System.Threads.ATSD;
- type ATSD is limited record
- Jmpbuf_Address : Address := Null_Address;
- -- Address of jump buffer used to store the address of the
- -- current longjmp/setjmp buffer for exception management.
- -- These buffers are threaded into a stack, and the address
- -- here is the top of the stack. A null address means that
- -- no exception handler is currently active.
+ -- begin
+ -- System.Threads.Thread_Body_Enter;
+ -- (_Secondary_Stack'Address,
+ -- _Secondary_Stack'Length,
+ -- _Process_ATSD'Address);
- Sec_Stack_Addr : Address := Null_Address;
- -- Address of currently allocated secondary stack
+ -- declare
+ -- <user declarations>
+ -- begin
+ -- <user statements>
+ -- <user exception handlers>
+ -- end;
- Current_Excep : aliased EO;
- -- Exception occurrence that contains the information for the
- -- current exception. Note that any exception in the same task
- -- destroys this information, so the data in this variable must
- -- be copied out before another exception can occur.
+ -- 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
- end record;
+ type ATSD is new System.Soft_Links.TSD;
end System.Threads;