OSDN Git Service

PR target/50678
[pf3gnuchains/gcc-fork.git] / gcc / ada / s-osinte-aix.ads
index c6e8213..64907fb 100644 (file)
@@ -1,13 +1,13 @@
 ------------------------------------------------------------------------------
 --                                                                          --
---                GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS               --
+--                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
 --                                                                          --
 --                   S Y S T E M . O S _ I N T E R F A C E                  --
 --                                                                          --
 --                                  S p e c                                 --
 --                                                                          --
 --             Copyright (C) 1991-1994, Florida State University            --
---             Copyright (C) 1995-2004, Free Software Foundation, Inc.      --
+--          Copyright (C) 1995-2009, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNARL 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- --
@@ -17,8 +17,8 @@
 -- 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 GNARL; see file COPYING.  If not, write --
--- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
--- MA 02111-1307, USA.                                                      --
+-- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
+-- Boston, MA 02110-1301, 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 is a AIX (Native THREADS) version of this package
 
---  This package encapsulates all direct interfaces to OS services
---  that are needed by children of System.
+--  This package encapsulates all direct interfaces to OS services that are
+--  needed by the tasking run-time (libgnarl).
 
 --  PLEASE DO NOT add any with-clauses to this package or remove the pragma
 --  Preelaborate. This package is designed to be a bottom-level (leaf) package.
 
+with Ada.Unchecked_Conversion;
+
 with Interfaces.C;
-with Unchecked_Conversion;
 
 package System.OS_Interface is
    pragma Preelaborate;
 
-   pragma Linker_Options ("-lpthreads");
+   pragma Linker_Options ("-pthread");
+   --  This implies -lpthreads + other things depending on the GCC
+   --  configuration, such as the selection of a proper libgcc variant
+   --  for table-based exception handling when it is available.
+
    pragma Linker_Options ("-lc_r");
 
    subtype int            is Interfaces.C.int;
@@ -116,28 +121,33 @@ package System.OS_Interface is
    SIGXFSZ     : constant := 25; --  filesize limit exceeded
    SIGWAITING  : constant := 39; --  m:n scheduling
 
-   --  the following signals are AIX specific
+   --  The following signals are AIX specific
+
    SIGMSG      : constant := 27; -- input data is in the ring buffer
    SIGDANGER   : constant := 33; -- system crash imminent
    SIGMIGRATE  : constant := 35; -- migrate process
    SIGPRE      : constant := 36; -- programming exception
    SIGVIRT     : constant := 37; -- AIX virtual time alarm
    SIGALRM1    : constant := 38; -- m:n condition variables
+   SIGCPUFAIL  : constant := 59; -- Predictive De-configuration of Processors
    SIGKAP      : constant := 60; -- keep alive poll from native keyboard
    SIGGRANT    : constant := SIGKAP; -- monitor mode granted
-   SIGRETRACT  : constant := 61; -- monitor mode should be relinguished
+   SIGRETRACT  : constant := 61; -- monitor mode should be relinquished
    SIGSOUND    : constant := 62; -- sound control has completed
    SIGSAK      : constant := 63; -- secure attention key
 
-   SIGADAABORT : constant := SIGTERM;
-   --  Note: on other targets, we usually use SIGABRT, but on AiX, it
-   --  appears that SIGABRT can't be used in sigwait(), so we use SIGTERM.
+   SIGADAABORT : constant := SIGEMT;
+   --  Note: on other targets, we usually use SIGABRT, but on AIX, it appears
+   --  that SIGABRT can't be used in sigwait(), so we use SIGEMT.
+   --  SIGEMT is "Emulator Trap Instruction" from the PDP-11, and does not
+   --  have a standardized usage.
 
    type Signal_Set is array (Natural range <>) of Signal;
 
-   Unmasked    : constant Signal_Set :=
-     (SIGTRAP, SIGTTIN, SIGTTOU, SIGTSTP, SIGPROF);
-   Reserved    : constant Signal_Set := (SIGABRT, SIGKILL, SIGSTOP);
+   Unmasked : constant Signal_Set :=
+                (SIGTRAP, SIGTTIN, SIGTTOU, SIGTSTP, SIGPROF);
+   Reserved : constant Signal_Set :=
+                (SIGABRT, SIGKILL, SIGSTOP, SIGALRM1, SIGWAITING, SIGCPUFAIL);
 
    type sigset_t is private;
 
@@ -164,7 +174,8 @@ package System.OS_Interface is
    pragma Convention (C, struct_sigaction);
    type struct_sigaction_ptr is access all struct_sigaction;
 
-   SA_SIGINFO  : constant := 16#0100#;
+   SA_SIGINFO : constant := 16#0100#;
+   SA_ONSTACK : constant := 16#0001#;
 
    SIG_BLOCK   : constant := 0;
    SIG_UNBLOCK : constant := 1;
@@ -183,8 +194,8 @@ package System.OS_Interface is
    -- Time --
    ----------
 
-   Time_Slice_Supported : constant Boolean := False;
-   --  Indicates wether time slicing is supported
+   Time_Slice_Supported : constant Boolean := True;
+   --  Indicates whether time slicing is supported
 
    type timespec is private;
 
@@ -195,8 +206,6 @@ package System.OS_Interface is
    function clock_gettime
      (clock_id : clockid_t;
       tp       : access timespec) return int;
-   --  AiX threads don't have clock_gettime
-   --  We instead use gettimeofday()
 
    function To_Duration (TS : timespec) return Duration;
    pragma Inline (To_Duration);
@@ -211,16 +220,6 @@ package System.OS_Interface is
    pragma Convention (C, struct_timezone);
    type struct_timezone_ptr is access all struct_timezone;
 
-   type struct_timeval is private;
-   --  This is needed on systems that do not have clock_gettime()
-   --  but do have gettimeofday().
-
-   function To_Duration (TV : struct_timeval) return Duration;
-   pragma Inline (To_Duration);
-
-   function To_Timeval (D : Duration) return struct_timeval;
-   pragma Inline (To_Timeval);
-
    -------------------------
    -- Priority Scheduling --
    -------------------------
@@ -229,6 +228,10 @@ package System.OS_Interface is
    SCHED_RR    : constant := 2;
    SCHED_OTHER : constant := 0;
 
+   function To_Target_Priority
+     (Prio : System.Any_Priority) return Interfaces.C.int;
+   --  Maps System.Any_Priority to a POSIX priority
+
    -------------
    -- Process --
    -------------
@@ -254,9 +257,10 @@ package System.OS_Interface is
 
    type Thread_Body is access
      function (arg : System.Address) return System.Address;
+   pragma Convention (C, Thread_Body);
 
    function Thread_Body_Access is new
-     Unchecked_Conversion (System.Address, Thread_Body);
+     Ada.Unchecked_Conversion (System.Address, Thread_Body);
 
    type pthread_t           is private;
    subtype Thread_Id        is pthread_t;
@@ -270,30 +274,49 @@ package System.OS_Interface is
 
    PTHREAD_CREATE_DETACHED : constant := 1;
 
+   PTHREAD_SCOPE_PROCESS : constant := 1;
+   PTHREAD_SCOPE_SYSTEM  : constant := 0;
+
    -----------
    -- Stack --
    -----------
 
+   type stack_t is record
+      ss_sp    : System.Address;
+      ss_size  : size_t;
+      ss_flags : int;
+   end record;
+   pragma Convention (C, stack_t);
+
+   function sigaltstack
+     (ss  : not null access stack_t;
+      oss : access stack_t) return int;
+   pragma Import (C, sigaltstack, "sigaltstack");
+
+   Alternate_Stack : aliased System.Address;
+   --  This is a dummy definition, never used (Alternate_Stack_Size is null)
+
+   Alternate_Stack_Size : constant := 0;
+   --  No alternate signal stack is used on this platform
+
    Stack_Base_Available : constant Boolean := False;
-   --  Indicates wether the stack base is available on this target.
+   --  Indicates whether the stack base is available on this target
 
    function Get_Stack_Base (thread : pthread_t) return Address;
    pragma Inline (Get_Stack_Base);
-   --  returns the stack base of the specified thread.
-   --  Only call this function when Stack_Base_Available is True.
+   --  Returns the stack base of the specified thread. Only call this function
+   --  when Stack_Base_Available is True.
 
    function Get_Page_Size return size_t;
    function Get_Page_Size return Address;
    pragma Import (C, Get_Page_Size, "getpagesize");
-   --  returns the size of a page, or 0 if this is not relevant on this
-   --  target
+   --  Returns the size of a page
 
    PROT_NONE  : constant := 0;
    PROT_READ  : constant := 1;
    PROT_WRITE : constant := 2;
    PROT_EXEC  : constant := 4;
    PROT_ALL   : constant := PROT_READ + PROT_WRITE + PROT_EXEC;
-
    PROT_ON    : constant := PROT_READ;
    PROT_OFF   : constant := PROT_ALL;
 
@@ -305,7 +328,7 @@ package System.OS_Interface is
    ---------------------------------------
 
    --  Though not documented, pthread_init *must* be called before any other
-   --  pthread call
+   --  pthread call.
 
    procedure pthread_init;
    pragma Import (C, pthread_init, "pthread_init");
@@ -324,12 +347,10 @@ package System.OS_Interface is
       sig    : Signal) return int;
    pragma Import (C, pthread_kill, "pthread_kill");
 
-   type sigset_t_ptr is access all sigset_t;
-
    function pthread_sigmask
      (how  : int;
-      set  : sigset_t_ptr;
-      oset : sigset_t_ptr) return int;
+      set  : access sigset_t;
+      oset : access sigset_t) return int;
    pragma Import (C, pthread_sigmask, "sigthreadmask");
 
    --------------------------
@@ -395,9 +416,11 @@ package System.OS_Interface is
    -- POSIX.1c  Section 13 --
    --------------------------
 
-   PTHREAD_PRIO_NONE    : constant := 0;
-   PTHREAD_PRIO_PROTECT : constant := 0;
-   PTHREAD_PRIO_INHERIT : constant := 0;
+   PTHREAD_PRIO_PROTECT : constant := 2;
+
+   function PTHREAD_PRIO_INHERIT return int;
+   --  Return value of C macro PTHREAD_PRIO_INHERIT. This function is needed
+   --  since the value is different between AIX versions.
 
    function pthread_mutexattr_setprotocol
      (attr     : access pthread_mutexattr_t;
@@ -443,7 +466,7 @@ package System.OS_Interface is
    pragma Import (C, pthread_attr_setschedparam);
 
    function sched_yield return int;
-   --  AiX have a nonstandard sched_yield.
+   --  AIX have a nonstandard sched_yield
 
    --------------------------
    -- P1003.1c  Section 16 --
@@ -492,8 +515,8 @@ package System.OS_Interface is
    function pthread_getspecific (key : pthread_key_t) return System.Address;
    pragma Import (C, pthread_getspecific, "pthread_getspecific");
 
-   type destructor_pointer is access
-      procedure (arg : System.Address);
+   type destructor_pointer is access procedure (arg : System.Address);
+   pragma Convention (C, destructor_pointer);
 
    function pthread_key_create
      (key        : access pthread_key_t;
@@ -501,7 +524,6 @@ package System.OS_Interface is
    pragma Import (C, pthread_key_create, "pthread_key_create");
 
 private
-
    type sigset_t is record
       losigs : unsigned_long;
       hisigs : unsigned_long;
@@ -521,12 +543,6 @@ private
    type clockid_t is new int;
    CLOCK_REALTIME : constant clockid_t := 0;
 
-   type struct_timeval is record
-      tv_sec  : long;
-      tv_usec : long;
-   end record;
-   pragma Convention (C, struct_timeval);
-
    type pthread_attr_t is new System.Address;
    pragma Convention (C, pthread_attr_t);
    --  typedef struct __pt_attr        *pthread_attr_t;