diff options
author | Justin Squirek <squirek@adacore.com> | 2024-03-11 15:15:34 +0000 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2024-05-21 09:26:44 +0200 |
commit | c32fd1a614bd3bfd219bb6fd72e9b7ebf4a0a9c2 (patch) | |
tree | 3b8c196f310613704dfe25382ab2c15e20a27315 /gcc/ada/libgnarl | |
parent | 0ebaffccb294d90184ad78367de66b6307de3ac0 (diff) | |
download | gcc-c32fd1a614bd3bfd219bb6fd72e9b7ebf4a0a9c2.zip gcc-c32fd1a614bd3bfd219bb6fd72e9b7ebf4a0a9c2.tar.gz gcc-c32fd1a614bd3bfd219bb6fd72e9b7ebf4a0a9c2.tar.bz2 |
ada: Add new Mingw task priority mapping
This patch adds a new mapping (Non_FIFO_Underlying_Priorities) for dynamically
setting task priorities in Windows when pragma Task_Dispatching_Policy
(FIFO_Within_Priorities) is not present. Additionally, it documents the
requirement to specify the pragma in order to use Set_Priority in the general
case.
gcc/ada/
* doc/gnat_ugn/platform_specific_information.rst: Add note about
different priority level granularities under different policies in
Windows and move POSIX related info into new section.
* libgnarl/s-taprop.ads: Add note about Task_Dispatching_Policy.
* libgnarl/s-taprop__mingw.adb:
(Set_Priority): Add use of Non_FIFO_Underlying_Priorities.
* libgnat/system-mingw.ads: Add documentation for modifying
priority mappings and add alternative mapping
Non_FIFO_Underlying_Priorities.
* gnat_ugn.texi: Regenerate.
Diffstat (limited to 'gcc/ada/libgnarl')
-rw-r--r-- | gcc/ada/libgnarl/s-taprop.ads | 9 | ||||
-rw-r--r-- | gcc/ada/libgnarl/s-taprop__mingw.adb | 5 |
2 files changed, 13 insertions, 1 deletions
diff --git a/gcc/ada/libgnarl/s-taprop.ads b/gcc/ada/libgnarl/s-taprop.ads index 35f0ea4..b3d2240 100644 --- a/gcc/ada/libgnarl/s-taprop.ads +++ b/gcc/ada/libgnarl/s-taprop.ads @@ -322,6 +322,15 @@ package System.Task_Primitives.Operations is -- priority (RM D.2.2 par 9). Loss_Of_Inheritance helps the underlying -- implementation to do it right when the OS doesn't. + -- Note: The behavior of Set_Priority is OS specific when a dispatching + -- policy is not specified, and, as a result, calls to Set_Priority may + -- have no affect without setting such a policy via pragma + -- Task_Dispatching_Policy. + + -- For example: + + -- pragma Task_Dispatching_Policy (FIFO_Within_Priorities); + function Get_Priority (T : ST.Task_Id) return System.Any_Priority; pragma Inline (Get_Priority); -- Returns the priority last set by Set_Priority for this task diff --git a/gcc/ada/libgnarl/s-taprop__mingw.adb b/gcc/ada/libgnarl/s-taprop__mingw.adb index df1cb67..3a124ba 100644 --- a/gcc/ada/libgnarl/s-taprop__mingw.adb +++ b/gcc/ada/libgnarl/s-taprop__mingw.adb @@ -675,7 +675,10 @@ package body System.Task_Primitives.Operations is Res := SetThreadPriority (T.Common.LL.Thread, - Interfaces.C.int (Underlying_Priorities (Prio))); + Interfaces.C.int ((if Dispatching_Policy = 'F' then + FIFO_Underlying_Priorities (Prio) + else + Underlying_Priorities (Prio)))); pragma Assert (Res = Win32.TRUE); -- Note: Annex D (RM D.2.3(5/2)) requires the task to be placed at the |