OSDN Git Service

* s-tassta.adb (Create_Task): Take into account tasks created by
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 13 Dec 2007 10:35:41 +0000 (10:35 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 13 Dec 2007 10:35:41 +0000 (10:35 +0000)
foreign threads.
Code clean up: use constants instead of hard coded values.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130865 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/s-tassta.adb

index ceea935..9c574f0 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);