]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s-tassta.adb (Create_Task): Take into account tasks created by foreign threads.
authorArnaud Charlet <charlet@gcc.gnu.org>
Thu, 13 Dec 2007 10:35:41 +0000 (11:35 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 13 Dec 2007 10:35:41 +0000 (11:35 +0100)
* 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

index ceea9352b3e629de597fb649b6777978ed6a6bb5..9c574f06dc81442c2221ef7676a8ea07eb507f1f 100644 (file)
@@ -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);