| ------------------------------------------------------------------------------ |
| -- -- |
| -- 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; |