From 4503aa6e08e282190851174dcb3ebbb90d509d85 Mon Sep 17 00:00:00 2001 From: charlet Date: Tue, 31 Oct 2006 17:45:11 +0000 Subject: 2006-10-31 Arnaud Charlet Jose Ruiz * s-osinte-posix.adb, s-osinte-linux.ads, s-osinte-freebsd.adb, s-osinte-freebsd.ads, s-osinte-solaris-posix.ads, s-osinte-hpux.ads, s-osinte-darwin.adb, s-osinte-darwin.ads, s-osinte-lynxos-3.ads, s-osinte-lynxos-3.adb (To_Target_Priority): New function maps from System.Any_Priority to a POSIX priority on the target. * system-linux-ia64.ads: Extend range of Priority types on Linux to use the whole range made available by the system. * s-osinte-aix.adb, s-osinte-aix.ads (To_Target_Priority): New function maps from System.Any_Priority to a POSIX priority on the target. (PTHREAD_PRIO_PROTECT): Set real value. (PTHREAD_PRIO_INHERIT): Now a function. (SIGCPUFAIL): New signal. (Reserved): Add SIGALRM1, SIGWAITING, SIGCPUFAIL, since these signals are documented as reserved by the OS. * system-aix.ads: Use the full range of priorities provided by the system on AIX. * s-taprop-posix.adb: Call new function To_Target_Priority. (Set_Priority): Take into account Task_Dispatching_Policy and Priority_Specific_Dispatching pragmas when determining if Round Robin must be used for scheduling the task. * system-linux-x86_64.ads, system-linux-x86.ads, system-linux-ppc.ads: Extend range of Priority types on Linux to use the whole range made available by the system. * s-taprop-vms.adb, s-taprop-mingw.adb, s-taprop-irix.adb, s-taprop-tru64.adb, s-taprop-linux.adb, s-taprop-hpux-dce.adb, s-taprop-lynxos.adb (Finalize_TCB): invalidate the stack-check cache when deallocating the TCB in order to avoid potential references to deallocated data. (Set_Priority): Take into account Task_Dispatching_Policy and Priority_Specific_Dispatching pragmas when determining if Round Robin or FIFO within priorities must be used for scheduling the task. * s-taprop-vxworks.adb (Enter_Task): Store the user-level task id in the Thread field (to be used internally by the run-time system) and the kernel-level task id in the LWP field (to be used by the debugger). (Create_Task): Reorganize to unify the calls to taskSpawn into a single instance, and propagate the current task options to the spawned task. (Set_Priority): Take into account Priority_Specific_Dispatching pragmas. (Initialize): Set Round Robin dispatching when the corresponding pragma is in effect. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118235 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/s-taprop-tru64.adb | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'gcc/ada/s-taprop-tru64.adb') diff --git a/gcc/ada/s-taprop-tru64.adb b/gcc/ada/s-taprop-tru64.adb index 120657fc47e..28e1a4a30c1 100644 --- a/gcc/ada/s-taprop-tru64.adb +++ b/gcc/ada/s-taprop-tru64.adb @@ -161,6 +161,10 @@ package body System.Task_Primitives.Operations is procedure Abort_Handler (Sig : Signal); -- Signal handler used to implement asynchronous abort + function Get_Policy (Prio : System.Any_Priority) return Character; + pragma Import (C, Get_Policy, "__gnat_get_specific_dispatching"); + -- Get priority specific dispatching policy + ------------------- -- Abort_Handler -- ------------------- @@ -635,15 +639,25 @@ package body System.Task_Primitives.Operations is Result : Interfaces.C.int; Param : aliased struct_sched_param; + Priority_Specific_Policy : constant Character := Get_Policy (Prio); + -- Upper case first character of the policy name corresponding to the + -- task as set by a Priority_Specific_Dispatching pragma. + begin T.Common.Current_Priority := Prio; Param.sched_priority := Interfaces.C.int (Underlying_Priorities (Prio)); - if Time_Slice_Val > 0 then + if Dispatching_Policy = 'R' + or else Priority_Specific_Policy = 'R' + or else Time_Slice_Val > 0 + then Result := pthread_setschedparam (T.Common.LL.Thread, SCHED_RR, Param'Access); - elsif Dispatching_Policy = 'F' or else Time_Slice_Val = 0 then + elsif Dispatching_Policy = 'F' + or else Priority_Specific_Policy = 'F' + or else Time_Slice_Val = 0 + then Result := pthread_setschedparam (T.Common.LL.Thread, SCHED_FIFO, Param'Access); @@ -784,6 +798,10 @@ package body System.Task_Primitives.Operations is Result : Interfaces.C.int; Param : aliased System.OS_Interface.struct_sched_param; + Priority_Specific_Policy : constant Character := Get_Policy (Priority); + -- Upper case first character of the policy name corresponding to the + -- task as set by a Priority_Specific_Dispatching pragma. + use System.Task_Info; begin @@ -815,11 +833,17 @@ package body System.Task_Primitives.Operations is (Attributes'Access, Param'Access); pragma Assert (Result = 0); - if Time_Slice_Val > 0 then + if Dispatching_Policy = 'R' + or else Priority_Specific_Policy = 'R' + or else Time_Slice_Val > 0 + then Result := pthread_attr_setschedpolicy (Attributes'Access, System.OS_Interface.SCHED_RR); - elsif Dispatching_Policy = 'F' or else Time_Slice_Val = 0 then + elsif Dispatching_Policy = 'F' + or else Priority_Specific_Policy = 'F' + or else Time_Slice_Val = 0 + then Result := pthread_attr_setschedpolicy (Attributes'Access, System.OS_Interface.SCHED_FIFO); -- cgit v1.2.1