diff options
Diffstat (limited to 'gcc/ada/s-tasinf-irix-athread.adb')
-rw-r--r-- | gcc/ada/s-tasinf-irix-athread.adb | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/gcc/ada/s-tasinf-irix-athread.adb b/gcc/ada/s-tasinf-irix-athread.adb new file mode 100644 index 00000000000..5413ebf8830 --- /dev/null +++ b/gcc/ada/s-tasinf-irix-athread.adb @@ -0,0 +1,312 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT COMPILER COMPONENTS -- +-- -- +-- S Y S T E M . T A S K _ I N F O -- +-- -- +-- B o d y -- +-- -- +-- Copyright (C) 1992-2004 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 body contains the routines associated with the implementation +-- of the Task_Info pragma. + +-- This is the SGI specific version of this module. + +with Interfaces.C; +with System.OS_Interface; +with System; +with Unchecked_Conversion; + +package body System.Task_Info is + + use System.OS_Interface; + use type Interfaces.C.int; + + function To_Resource_T is new + Unchecked_Conversion (Resource_Vector_T, resource_t); + + MP_NPROCS : constant := 1; + + function Sysmp (Cmd : Integer) return Integer; + pragma Import (C, Sysmp); + + function Num_Processors (Cmd : Integer := MP_NPROCS) return Integer + renames Sysmp; + + function Geteuid return Integer; + pragma Import (C, Geteuid); + + Locking_Map : constant array (Page_Locking) of Interfaces.C.int := + (NOLOCK => 0, + PROCLOCK => 1, + TXTLOCK => 2, + DATLOCK => 4); + + ------------------------------- + -- Resource_Vector_Functions -- + ------------------------------- + + package body Resource_Vector_Functions is + + --------- + -- "+" -- + --------- + + function "+" (R : Resource_T) return Resource_Vector_T is + Result : Resource_Vector_T := NO_RESOURCES; + begin + Result (Resource_T'Pos (R)) := True; + return Result; + end "+"; + + function "+" (R1, R2 : Resource_T) return Resource_Vector_T is + Result : Resource_Vector_T := NO_RESOURCES; + begin + Result (Resource_T'Pos (R1)) := True; + Result (Resource_T'Pos (R2)) := True; + return Result; + end "+"; + + function "+" + (R : Resource_T; + S : Resource_Vector_T) return Resource_Vector_T + is + Result : Resource_Vector_T := S; + begin + Result (Resource_T'Pos (R)) := True; + return Result; + end "+"; + + function "+" + (S : Resource_Vector_T; + R : Resource_T) return Resource_Vector_T + is + Result : Resource_Vector_T := S; + begin + Result (Resource_T'Pos (R)) := True; + return Result; + end "+"; + + function "+" (S1, S2 : Resource_Vector_T) return Resource_Vector_T is + Result : Resource_Vector_T; + begin + Result := S1 or S2; + return Result; + end "+"; + + function "-" + (S : Resource_Vector_T; + R : Resource_T) return Resource_Vector_T + is + Result : Resource_Vector_T := S; + begin + Result (Resource_T'Pos (R)) := False; + return Result; + end "-"; + + end Resource_Vector_Functions; + + --------------- + -- New_Sproc -- + --------------- + + function New_Sproc (Attr : Sproc_Attributes) return sproc_t is + Sproc_Attr : aliased sproc_attr_t; + Sproc : aliased sproc_t; + Status : int; + + begin + Status := sproc_attr_init (Sproc_Attr'Unrestricted_Access); + + if Status = 0 then + Status := sproc_attr_setresources + (Sproc_Attr'Unrestricted_Access, + To_Resource_T (Attr.Sproc_Resources)); + + if Attr.CPU /= ANY_CPU then + if Attr.CPU > Num_Processors then + raise Invalid_CPU_Number; + end if; + + Status := sproc_attr_setcpu + (Sproc_Attr'Unrestricted_Access, + int (Attr.CPU)); + end if; + + if Attr.Resident /= NOLOCK then + if Geteuid /= 0 then + raise Permission_Error; + end if; + + Status := sproc_attr_setresident + (Sproc_Attr'Unrestricted_Access, + Locking_Map (Attr.Resident)); + end if; + + if Attr.NDPRI /= NDP_NONE then + +-- ??? why is this commented out, should it be removed ? +-- if Geteuid /= 0 then +-- raise Permission_Error; +-- end if; + + Status := + sproc_attr_setprio + (Sproc_Attr'Unrestricted_Access, int (Attr.NDPRI)); + end if; + + Status := + sproc_create + (Sproc'Unrestricted_Access, + Sproc_Attr'Unrestricted_Access, + null, + System.Null_Address); + + if Status /= 0 then + Status := sproc_attr_destroy (Sproc_Attr'Unrestricted_Access); + raise Sproc_Create_Error; + end if; + + Status := sproc_attr_destroy (Sproc_Attr'Unrestricted_Access); + end if; + + if Status /= 0 then + raise Sproc_Create_Error; + end if; + + return Sproc; + end New_Sproc; + + --------------- + -- New_Sproc -- + --------------- + + function New_Sproc + (Sproc_Resources : Resource_Vector_T := NO_RESOURCES; + CPU : CPU_Number := ANY_CPU; + Resident : Page_Locking := NOLOCK; + NDPRI : Non_Degrading_Priority := NDP_NONE) return sproc_t + is + Attr : constant Sproc_Attributes := + (Sproc_Resources, CPU, Resident, NDPRI); + begin + return New_Sproc (Attr); + end New_Sproc; + + ------------------------------- + -- Unbound_Thread_Attributes -- + ------------------------------- + + function Unbound_Thread_Attributes + (Thread_Resources : Resource_Vector_T := NO_RESOURCES; + Thread_Timeslice : Duration := 0.0) return Thread_Attributes + is + begin + return (False, Thread_Resources, Thread_Timeslice); + end Unbound_Thread_Attributes; + + ----------------------------- + -- Bound_Thread_Attributes -- + ----------------------------- + + function Bound_Thread_Attributes + (Thread_Resources : Resource_Vector_T := NO_RESOURCES; + Thread_Timeslice : Duration := 0.0; + Sproc : sproc_t) + return Thread_Attributes + is + begin + return (True, Thread_Resources, Thread_Timeslice, Sproc); + end Bound_Thread_Attributes; + + ----------------------------- + -- Bound_Thread_Attributes -- + ----------------------------- + + function Bound_Thread_Attributes + (Thread_Resources : Resource_Vector_T := NO_RESOURCES; + Thread_Timeslice : Duration := 0.0; + Sproc_Resources : Resource_Vector_T := NO_RESOURCES; + CPU : CPU_Number := ANY_CPU; + Resident : Page_Locking := NOLOCK; + NDPRI : Non_Degrading_Priority := NDP_NONE) + return Thread_Attributes + is + Sproc : constant sproc_t := New_Sproc + (Sproc_Resources, CPU, Resident, NDPRI); + begin + return (True, Thread_Resources, Thread_Timeslice, Sproc); + end Bound_Thread_Attributes; + + ----------------------------------- + -- New_Unbound_Thread_Attributes -- + ----------------------------------- + + function New_Unbound_Thread_Attributes + (Thread_Resources : Resource_Vector_T := NO_RESOURCES; + Thread_Timeslice : Duration := 0.0) return Task_Info_Type + is + begin + return new Thread_Attributes' + (False, Thread_Resources, Thread_Timeslice); + end New_Unbound_Thread_Attributes; + + --------------------------------- + -- New_Bound_Thread_Attributes -- + --------------------------------- + + function New_Bound_Thread_Attributes + (Thread_Resources : Resource_Vector_T := NO_RESOURCES; + Thread_Timeslice : Duration := 0.0; + Sproc : sproc_t) return Task_Info_Type + is + begin + return new Thread_Attributes' + (True, Thread_Resources, Thread_Timeslice, Sproc); + end New_Bound_Thread_Attributes; + + --------------------------------- + -- New_Bound_Thread_Attributes -- + --------------------------------- + + function New_Bound_Thread_Attributes + (Thread_Resources : Resource_Vector_T := NO_RESOURCES; + Thread_Timeslice : Duration := 0.0; + Sproc_Resources : Resource_Vector_T := NO_RESOURCES; + CPU : CPU_Number := ANY_CPU; + Resident : Page_Locking := NOLOCK; + NDPRI : Non_Degrading_Priority := NDP_NONE) + return Task_Info_Type + is + Sproc : constant sproc_t := New_Sproc + (Sproc_Resources, CPU, Resident, NDPRI); + begin + return new Thread_Attributes' + (True, Thread_Resources, Thread_Timeslice, Sproc); + end New_Bound_Thread_Attributes; + +end System.Task_Info; |