From: Arnaud Charlet Date: Thu, 13 Dec 2007 10:35:41 +0000 (+0100) Subject: s-tassta.adb (Create_Task): Take into account tasks created by foreign threads. X-Git-Tag: releases/gcc-4.3.0~1031 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=31eee11b7cf2f550581949d87443b688232bd2a6;p=thirdparty%2Fgcc.git 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 --- 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);