diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-09-18 13:40:54 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-09-18 13:40:54 +0000 |
commit | d2cf6f2ed6c0439478a7deb0372395171d18e26f (patch) | |
tree | 60698fbf303f15de24e86c6bb64c0aef1c577c52 /gcc/ada/s-tassta.adb | |
parent | 14a02588972bf9f27cff981fa464978c07f039c9 (diff) | |
download | gcc-d2cf6f2ed6c0439478a7deb0372395171d18e26f.tar.gz |
2009-09-18 Arnaud Charlet <charlet@adacore.com>
* s-taprop-tru64.adb, s-taprop-linux.adb, s-taprop-solaris.adb,
s-taprop-irix.adb, s-taprop-posix.adb (Abort_Task): Do nothing if no
signal handler is installed.
* s-tassta.adb (Finalize_Global_Tasks): Do not wait for independent
tasks if Abort_Task_Interrupt cannot be used.
2009-09-18 Vincent Celier <celier@adacore.com>
* prj-tree.ads: Minor comment update
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151841 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/s-tassta.adb')
-rw-r--r-- | gcc/ada/s-tassta.adb | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/gcc/ada/s-tassta.adb b/gcc/ada/s-tassta.adb index 1ae5b651ebf..f56614ca7bd 100644 --- a/gcc/ada/s-tassta.adb +++ b/gcc/ada/s-tassta.adb @@ -36,6 +36,7 @@ pragma Polling (Off); with Ada.Exceptions; with Ada.Unchecked_Deallocation; +with System.Interrupt_Management; with System.Tasking.Debug; with System.Address_Image; with System.Task_Primitives; @@ -739,6 +740,17 @@ package body System.Tasking.Stages is Ignore : Boolean; pragma Unreferenced (Ignore); + function State + (Int : System.Interrupt_Management.Interrupt_ID) return Character; + pragma Import (C, State, "__gnat_get_interrupt_state"); + -- Get interrupt state. Defined in a-init.c + -- The input argument is the interrupt number, + -- and the result is one of the following: + + Default : constant Character := 's'; + -- 's' Interrupt_State pragma set state to System (use "default" + -- system handler) + begin if Self_ID.Deferral_Level = 0 then -- ??? @@ -781,17 +793,26 @@ package body System.Tasking.Stages is Write_Lock (Self_ID); - loop - exit when Utilities.Independent_Task_Count = 0; + -- If the Abort_Task signal is set to system, it means that we may not + -- have been able to abort all independent tasks (in particular + -- Server_Task may be blocked, waiting for a signal), in which case, + -- do not wait for Independent_Task_Count to go down to 0. - -- We used to yield here, but this did not take into account low - -- priority tasks that would cause dead lock in some cases (true - -- FIFO scheduling). + if State + (System.Interrupt_Management.Abort_Task_Interrupt) /= Default + then + loop + exit when Utilities.Independent_Task_Count = 0; - Timed_Sleep - (Self_ID, 0.01, System.OS_Primitives.Relative, - Self_ID.Common.State, Ignore, Ignore); - end loop; + -- We used to yield here, but this did not take into account low + -- priority tasks that would cause dead lock in some cases (true + -- FIFO scheduling). + + Timed_Sleep + (Self_ID, 0.01, System.OS_Primitives.Relative, + Self_ID.Common.State, Ignore, Ignore); + end loop; + end if; -- ??? On multi-processor environments, it seems that the above loop -- isn't sufficient, so we need to add an additional delay. |