File : posix-process_scheduling.adb
------------------------------------------------------------------------------
-- --
-- FLORIST (FSU Implementation of POSIX.5) COMPONENTS --
-- --
-- P O S I X . P R O C E S S _ S C H E D U L I N G --
-- --
-- B o d y --
-- --
-- --
-- Copyright (c) 1996, 1997 Florida State University (FSU), --
-- All Rights Reserved. --
-- --
-- This file is a component of FLORIST, an implementation of an Ada API --
-- for the POSIX OS services, for use with the GNAT Ada compiler and --
-- the FSU Gnu Ada Runtime Library (GNARL). The interface is intended --
-- to be close to that specified in IEEE STD 1003.5: 1990 and IEEE STD --
-- 1003.5b: 1996. --
-- --
-- FLORIST is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. FLORIST is distributed in the hope that it will be --
-- useful, but WITHOUT 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 GNARL; 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. --
-- --
------------------------------------------------------------------------------
-- [$Revision: 1.2 $]
with POSIX.C,
POSIX.Implementation,
POSIX.Process_Identification,
Unchecked_Conversion;
package body POSIX.Process_Scheduling is
use POSIX.C;
use POSIX.Implementation;
--------------------
-- Get_Priority --
--------------------
function Get_Priority (Parameters : Scheduling_Parameters)
return Scheduling_Priority is
begin
return Scheduling_Priority (Parameters.Param.sched_priority);
end Get_Priority;
--------------------
-- Set_Priority --
--------------------
procedure Set_Priority
(Parameters : in out Scheduling_Parameters;
Priority : in Scheduling_Priority) is
begin
Parameters.Param.sched_priority := int (Priority);
end Set_Priority;
---------------------------------
-- Set_Scheduling_Parameters --
---------------------------------
function sched_setparam
(pid : pid_t;
param : sched_param_ptr) return int;
pragma Import (C, sched_setparam, sched_setparam_LINKNAME);
function To_pid_t is
new Unchecked_Conversion (POSIX.Process_Identification.Process_ID, pid_t);
procedure Set_Scheduling_Parameters
(Process : in POSIX_Process_Identification.Process_ID;
Parameters : in Scheduling_Parameters) is
begin
Check (sched_setparam (To_pid_t (Process),
Parameters.Param'Unchecked_Access));
end Set_Scheduling_Parameters;
---------------------------------
-- Get_Scheduling_Parameters --
---------------------------------
function sched_getparam
(pid : pid_t;
param : access struct_sched_param) return int;
pragma Import (C, sched_getparam, sched_getparam_LINKNAME);
function Get_Scheduling_Parameters
(Process : POSIX_Process_Identification.Process_ID)
return Scheduling_Parameters is
Params : aliased Scheduling_Parameters;
begin
Check (sched_getparam
(To_pid_t (Process), Params.Param'Unchecked_Access));
return Scheduling_Parameters (Params);
end Get_Scheduling_Parameters;
-----------------------------
-- Set_Scheduling_Policy --
-----------------------------
function sched_setscheduler
(pid : pid_t;
policy : int;
param : sched_param_ptr) return int;
pragma Import (C, sched_setscheduler, sched_setscheduler_LINKNAME);
procedure Set_Scheduling_Policy
(Process : in POSIX_Process_Identification.Process_ID;
New_Policy : in Scheduling_Policy;
Parameters : in Scheduling_Parameters) is
begin
Check (sched_setscheduler
(To_pid_t (Process),
int (New_Policy),
Parameters.Param'Unchecked_Access));
end Set_Scheduling_Policy;
-----------------------------
-- Get_Scheduling_Policy --
-----------------------------
function sched_getscheduler (pid : pid_t) return int;
pragma Import (C, sched_getscheduler, sched_getscheduler_LINKNAME);
function Get_Scheduling_Policy
(Process : POSIX_Process_Identification.Process_ID)
return Scheduling_Policy is
begin
return Scheduling_Policy
(Check (sched_getscheduler (To_pid_t (Process))));
end Get_Scheduling_Policy;
-------------
-- Yield --
-------------
function sched_yield return int;
pragma Import (C, sched_yield, sched_yield_LINKNAME);
procedure Yield is
begin
Check (sched_yield);
end Yield;
----------------------------
-- Get_Maximum_Priority --
----------------------------
function sched_get_priority_max (policy : int) return int;
pragma Import (C, sched_get_priority_max, sched_get_priority_max_LINKNAME);
function Get_Maximum_Priority (Policy : Scheduling_Policy)
return Scheduling_Priority is
begin
return Scheduling_Priority
(Check (sched_get_priority_max (int (Policy))));
end Get_Maximum_Priority;
----------------------------
-- Get_Minimum_Priority --
----------------------------
function sched_get_priority_min (policy : int) return int;
pragma Import (C, sched_get_priority_min, sched_get_priority_min_LINKNAME);
function Get_Minimum_Priority (Policy : Scheduling_Policy)
return Scheduling_Priority is
begin
return Scheduling_Priority
(Check (sched_get_priority_min (int (Policy))));
end Get_Minimum_Priority;
---------------------------------
-- Get_Round_Robin_Interval --
---------------------------------
function sched_rr_get_interval
(pid : pid_t;
interval : access struct_timespec) return int;
pragma Import (C, sched_rr_get_interval, sched_rr_get_interval_LINKNAME);
function Get_Round_Robin_Interval
(Process : POSIX_Process_Identification.Process_ID)
return POSIX.Timespec is
TS : aliased struct_timespec;
begin
Check (sched_rr_get_interval (To_pid_t (Process), TS'Unchecked_Access));
return To_Timespec (TS);
end Get_Round_Robin_Interval;
end POSIX.Process_Scheduling;