From 31eee11b7cf2f550581949d87443b688232bd2a6 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Thu, 13 Dec 2007 11:35:41 +0100 Subject: [PATCH] s-tassta.adb (Create_Task): Take into account tasks created by foreign threads. * s-tassta.adb (Create_Task): Take into account tasks created by foreign threads. Code clean up: use constants instead of hard coded values. From-SVN: r130865 --- gcc/ada/s-tassta.adb | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/gcc/ada/s-tassta.adb b/gcc/ada/s-tassta.adb index ceea9352b3e6..9c574f06dc81 100644 --- a/gcc/ada/s-tassta.adb +++ b/gcc/ada/s-tassta.adb @@ -614,7 +614,18 @@ package body System.Tasking.Stages is (Storage_Error'Identity, "Failed to initialize task"); end if; - T.Master_of_Task := Master; + if Master = Foreign_Task_Level + 2 then + + -- This should not happen, except when a foreign task creates non + -- library-level Ada tasks. In this case, we pretend the master is + -- a regular library level task, otherwise the run-time will get + -- confused when waiting for these tasks to terminate. + + T.Master_of_Task := Library_Task_Level; + else + T.Master_of_Task := Master; + end if; + T.Master_Within := T.Master_of_Task + 1; for L in T.Entry_Calls'Range loop @@ -1276,7 +1287,7 @@ package body System.Tasking.Stages is -- Check if the current task is an independent task If so, decrement -- the Independent_Task_Count value. - if Master_of_Task = 2 then + if Master_of_Task = Independent_Task_Level then if Single_Lock then Utilities.Independent_Task_Count := Utilities.Independent_Task_Count - 1; @@ -1772,7 +1783,7 @@ package body System.Tasking.Stages is if (T.Common.Parent /= null and then T.Common.Parent.Common.Parent /= null) - or else T.Master_of_Task > 3 + or else T.Master_of_Task > Library_Task_Level then Initialization.Task_Lock (Self_ID); -- 2.47.2