diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-08 12:32:37 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-08 12:32:37 +0000 |
commit | 313d62a349ecb8ad8a419783fe776c7ecd5384d0 (patch) | |
tree | 7717c5e62d64af14c96a1abe2b5c0bd6b8300db2 /gcc/ada/s-tassta.adb | |
parent | a540eb41c1e6735a9a0b9c549e6be624a25c9e6a (diff) | |
download | gcc-313d62a349ecb8ad8a419783fe776c7ecd5384d0.tar.gz |
2012-10-08 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 192205 using svnmerge.py
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@192206 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/s-tassta.adb')
-rw-r--r-- | gcc/ada/s-tassta.adb | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/ada/s-tassta.adb b/gcc/ada/s-tassta.adb index 57c28be4ee5..08886c157bb 100644 --- a/gcc/ada/s-tassta.adb +++ b/gcc/ada/s-tassta.adb @@ -1905,7 +1905,16 @@ package body System.Tasking.Stages is C := All_Tasks_List; P := null; while C /= null loop - if C.Common.Parent = Self_ID and then C.Master_of_Task >= CM then + + -- If Free_On_Termination is set, do nothing here, and let the + -- task free itself if not already done, otherwise we risk a race + -- condition where Vulnerable_Free_Task is called in the loop below, + -- while the task calls Free_Task itself, in Terminate_Task. + + if C.Common.Parent = Self_ID + and then C.Master_of_Task >= CM + and then not C.Free_On_Termination + then if P /= null then P.Common.All_Tasks_Link := C.Common.All_Tasks_Link; else @@ -2088,9 +2097,7 @@ package body System.Tasking.Stages is -- is called from Expunge_Unactivated_Tasks. -- For tasks created by elaboration of task object declarations it is - -- called from the finalization code of the Task_Wrapper procedure. It is - -- also called from Ada.Unchecked_Deallocation, for objects that are or - -- contain tasks. + -- called from the finalization code of the Task_Wrapper procedure. procedure Vulnerable_Free_Task (T : Task_Id) is begin |