diff options
Diffstat (limited to 'gcc/ada/s-thread.ads')
-rw-r--r-- | gcc/ada/s-thread.ads | 93 |
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; |