aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/s-tasuti.adb
diff options
context:
space:
mode:
authorGeert Bosch <bosch@gcc.gnu.org>2002-03-08 21:11:04 +0100
committerGeert Bosch <bosch@gcc.gnu.org>2002-03-08 21:11:04 +0100
commit07fc65c47c45af6439208797e1ab26f7daedb666 (patch)
treeb584a79288c93215b05fb451943291ccd039388b /gcc/ada/s-tasuti.adb
parent24965e7a8ac518b99a3bd7ef5b2d8d88f96bf514 (diff)
downloadgcc-07fc65c47c45af6439208797e1ab26f7daedb666.zip
gcc-07fc65c47c45af6439208797e1ab26f7daedb666.tar.gz
gcc-07fc65c47c45af6439208797e1ab26f7daedb666.tar.bz2
41intnam.ads, [...]: Merge in ACT changes.
* 41intnam.ads, 42intnam.ads, 4aintnam.ads, 4cintnam.ads, 4dintnam.ads, 4gintnam.ads, 4hintnam.ads, 4lintnam.ads, 4mintnam.ads, 4pintnam.ads, 4rintnam.ads, 4sintnam.ads, 4uintnam.ads, 4vcalend.adb, 4zintnam.ads, 52system.ads, 5amastop.adb, 5asystem.ads, 5ataprop.adb, 5atpopsp.adb, 5avxwork.ads, 5bosinte.adb, 5bsystem.ads, 5esystem.ads, 5fsystem.ads, 5ftaprop.adb, 5ginterr.adb, 5gmastop.adb, 5gsystem.ads, 5gtaprop.adb, 5gtasinf.adb, 5gtasinf.ads, 5hparame.ads, 5hsystem.ads, 5htaprop.adb, 5htraceb.adb, 5itaprop.adb, 5ksystem.ads, 5kvxwork.ads, 5lintman.adb, 5lsystem.ads, 5mvxwork.ads, 5ninmaop.adb, 5nosinte.ads, 5ntaprop.adb, 5ointerr.adb, 5omastop.adb, 5oosinte.adb, 5osystem.ads, 5otaprop.adb, 5otaspri.ads, 5pvxwork.ads, 5qtaprop.adb, 5sintman.adb, 5ssystem.ads, 5staprop.adb, 5stpopse.adb, 5svxwork.ads, 5tosinte.ads, 5uintman.adb, 5vasthan.adb, 5vinmaop.adb, 5vinterr.adb, 5vintman.adb, 5vmastop.adb, 5vparame.ads, 5vsystem.ads, 5vtaprop.adb, 5vtpopde.adb, 5wmemory.adb, 5wsystem.ads, 5wtaprop.adb, 5ysystem.ads, 5zinterr.adb, 5zintman.adb, 5zosinte.adb, 5zosinte.ads, 5zsystem.ads, 5ztaprop.adb, 6vcpp.adb, 6vcstrea.adb, 7sintman.adb, 7staprop.adb, 7stpopsp.adb, 9drpc.adb, Make-lang.in, Makefile.in, a-caldel.adb, a-comlin.ads, a-dynpri.adb, a-except.adb, a-except.ads, a-finali.adb, a-ncelfu.ads, a-reatim.adb, a-retide.adb, a-stream.ads, a-ststio.adb, a-ststio.ads, a-stwifi.adb, a-tags.adb, a-tasatt.adb, a-textio.adb, a-tideau.adb, a-tiflau.adb, a-tigeau.adb, a-tigeau.ads, a-tiinau.adb, a-timoau.adb, a-witeio.adb, a-wtdeau.adb, a-wtenau.adb, a-wtflau.adb, a-wtgeau.adb, a-wtgeau.ads, a-wtinau.adb, a-wtmoau.adb, ada-tree.def, ada-tree.h, adaint.c, adaint.h, ali-util.adb, ali.adb, ali.ads, atree.adb, atree.ads, atree.h, back_end.adb, bcheck.adb, bindgen.adb, bindusg.adb, checks.adb, comperr.adb, config-lang.in, csets.adb, csets.ads, cstand.adb, cstreams.c, debug.adb, debug.ads, decl.c, einfo.adb, einfo.ads, einfo.h, elists.h, errout.adb, errout.ads, eval_fat.adb, exp_aggr.adb, exp_attr.adb, exp_ch11.adb, exp_ch12.adb, exp_ch13.adb, exp_ch2.adb, exp_ch3.adb, exp_ch3.ads, exp_ch4.adb, exp_ch5.adb, exp_ch6.adb, exp_ch7.adb, exp_ch7.ads, exp_ch9.adb, exp_ch9.ads, exp_dbug.adb, exp_dbug.ads, exp_disp.ads, exp_dist.adb, exp_fixd.adb, exp_intr.adb, exp_pakd.adb, exp_prag.adb, exp_strm.adb, exp_util.adb, exp_util.ads, expander.adb, expect.c, fe.h, fmap.adb, fmap.ads, fname-uf.adb, freeze.adb, frontend.adb, g-awk.adb, g-cgideb.adb, g-comlin.adb, g-comlin.ads, g-debpoo.adb, g-dirope.adb, g-dirope.ads, g-dyntab.adb, g-expect.adb, g-expect.ads, g-io.ads, g-io_aux.adb, g-io_aux.ads, g-locfil.adb, g-locfil.ads, g-os_lib.adb, g-os_lib.ads, g-regexp.adb, g-regpat.adb, g-socket.adb, g-socket.ads, g-spipat.adb, g-table.adb, g-trasym.adb, g-trasym.ads, gigi.h, gmem.c, gnat1drv.adb, gnatbind.adb, gnatbl.c, gnatchop.adb, gnatcmd.adb, gnatdll.adb, gnatfind.adb, gnatlbr.adb, gnatlink.adb, gnatls.adb, gnatmem.adb, gnatprep.adb, gnatvsn.ads, gnatxref.adb, hlo.adb, hostparm.ads, i-cobol.adb, i-cpp.adb, i-cstrea.ads, i-cstrin.adb, i-pacdec.adb, i-vxwork.ads, impunit.adb, init.c, inline.adb, io-aux.c, layout.adb, lib-load.adb, lib-util.adb, lib-writ.adb, lib-writ.ads, lib-xref.adb, lib-xref.ads, lib.adb, lib.ads, make.adb, makeusg.adb, mdll.adb, memroot.adb, misc.c, mlib-tgt.adb, mlib-utl.adb, mlib-utl.ads, mlib.adb, namet.adb, namet.ads, namet.h, nlists.h, nmake.adb, nmake.ads, nmake.adt, opt.adb, opt.ads, osint.adb, osint.ads, output.adb, output.ads, par-ch2.adb, par-ch3.adb, par-ch5.adb, par-prag.adb, par-tchk.adb, par-util.adb, par.adb, prj-attr.adb, prj-dect.adb, prj-env.adb, prj-env.ads, prj-nmsc.adb, prj-part.adb, prj-proc.adb, prj-strt.adb, prj-tree.adb, prj-tree.ads, prj.adb, prj.ads, raise.c, raise.h, repinfo.adb, restrict.adb, restrict.ads, rident.ads, rtsfind.adb, rtsfind.ads, s-arit64.adb, s-asthan.adb, s-atacco.adb, s-atacco.ads, s-auxdec.adb, s-crc32.adb, s-crc32.ads, s-direio.adb, s-fatgen.adb, s-fileio.adb, s-finimp.adb, s-gloloc.adb, s-gloloc.ads, s-interr.adb, s-mastop.adb, s-mastop.ads, s-memory.adb, s-parame.ads, s-parint.adb, s-pooglo.adb, s-pooloc.adb, s-rpc.adb, s-secsta.adb, s-sequio.adb, s-shasto.adb, s-soflin.adb, s-soflin.ads, s-stache.adb, s-taasde.adb, s-taasde.ads, s-tadeca.adb, s-tadeca.ads, s-tadert.adb, s-tadert.ads, s-taenca.adb, s-taenca.ads, s-taprob.adb, s-taprop.ads, s-tarest.adb, s-tasdeb.adb, s-tasini.adb, s-tasini.ads, s-taskin.adb, s-taskin.ads, s-tasque.adb, s-tasque.ads, s-tasren.adb, s-tasren.ads, s-tassta.adb, s-tasuti.adb, s-tasuti.ads, s-tataat.adb, s-tataat.ads, s-tpoben.adb, s-tpoben.ads, s-tpobop.adb, s-tposen.adb, s-tposen.ads, s-traceb.adb, s-traceb.ads, s-unstyp.ads, s-widenu.adb, scn-nlit.adb, scn.adb, sem.adb, sem_aggr.adb, sem_attr.adb, sem_attr.ads, sem_case.adb, sem_ch10.adb, sem_ch11.adb, sem_ch11.ads, sem_ch12.adb, sem_ch13.adb, sem_ch13.ads, sem_ch2.adb, sem_ch3.adb, sem_ch3.ads, sem_ch4.adb, sem_ch5.adb, sem_ch6.adb, sem_ch6.ads, sem_ch7.adb, sem_ch8.adb, sem_ch8.ads, sem_ch9.adb, sem_disp.adb, sem_dist.adb, sem_elab.adb, sem_elim.adb, sem_elim.ads, sem_eval.adb, sem_intr.adb, sem_mech.adb, sem_prag.adb, sem_res.adb, sem_type.adb, sem_util.adb, sem_util.ads, sem_vfpt.adb, sem_warn.adb, sinfo.adb, sinfo.ads, sinfo.h, sinput-l.adb, sinput-l.ads, sinput.adb, sinput.ads, snames.adb, snames.ads, snames.h, sprint.adb, sprint.ads, stringt.adb, stringt.ads, stringt.h, style.adb, switch.adb, switch.ads, sysdep.c, system.ads, table.adb, targparm.adb, targparm.ads, targtyps.c, tbuild.adb, tbuild.ads, tracebak.c, trans.c, tree_gen.adb, tree_io.adb, treepr.adb, treepr.ads, treeprs.ads, treeprs.adt, ttypes.ads, types.adb, types.ads, types.h, uintp.ads, urealp.ads, usage.adb, utils.c, utils2.c, validsw.adb, xnmake.adb, xr_tabls.adb, xr_tabls.ads, xref_lib.adb, xref_lib.ads : Merge in ACT changes. * 1ssecsta.adb, 1ssecsta.ads, a-chlat9.ads, a-cwila9.ads, g-enblsp.adb, g-md5.adb, g-md5.ads, gnatname.adb, gnatname.ads, mkdir.c, osint-b.adb, osint-b.ads, osint-c.adb, osint-c.ads, osint-l.adb, osint-l.ads, osint-m.adb, osint-m.ads : New files * 3lsoccon.ads, 5qparame.ads, 5qvxwork.ads, 5smastop.adb, 5zparame.ads, gnatmain.adb, gnatmain.ads, gnatpsys.adb : Removed * mdllfile.adb, mdllfile.ads, mdlltool.adb, mdlltool.ads : Renamed to mdll-fil.ad[bs] and mdll-util.ad[bs] * mdll-fil.adb, mdll-fil.ads, mdll-utl.adb, mdll-utl.ads : Renamed from mdllfile.ad[bs] and mdlltool.ad[bs] From-SVN: r50451
Diffstat (limited to 'gcc/ada/s-tasuti.adb')
-rw-r--r--gcc/ada/s-tasuti.adb145
1 files changed, 53 insertions, 92 deletions
diff --git a/gcc/ada/s-tasuti.adb b/gcc/ada/s-tasuti.adb
index af72964..546b167 100644
--- a/gcc/ada/s-tasuti.adb
+++ b/gcc/ada/s-tasuti.adb
@@ -6,9 +6,9 @@
-- --
-- B o d y --
-- --
--- $Revision: 1.67 $
+-- $Revision$
-- --
--- Copyright (C) 1991-2001, Florida State University --
+-- Copyright (C) 1992-2002, Free Software Foundation, Inc. --
-- --
-- GNARL is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -29,8 +29,7 @@
-- covered by the GNU Public License. --
-- --
-- GNARL was developed by the GNARL team at Florida State University. It is --
--- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
--- State University (http://www.gnat.com). --
+-- now maintained by Ada Core Technologies, Inc. (http://www.gnat.com). --
-- --
------------------------------------------------------------------------------
@@ -51,7 +50,7 @@ with System.Task_Primitives.Operations;
-- Unlock
-- Sleep
-- Abort_Task
--- Lock/Unlock_All_Tasks_List
+-- Lock/Unlock_RTS
with System.Tasking.Initialization;
-- Used for Defer_Abort
@@ -65,56 +64,42 @@ with System.Tasking.Queuing;
with System.Tasking.Debug;
-- used for Trace
+with System.Parameters;
+-- used for Single_Lock
+-- Runtime_Traces
+
+with System.Traces.Tasking;
+-- used for Send_Trace_Info
+
with Unchecked_Conversion;
package body System.Tasking.Utilities is
package STPO renames System.Task_Primitives.Operations;
- use System.Tasking.Debug;
- use System.Task_Primitives;
- use System.Task_Primitives.Operations;
-
- procedure Locked_Abort_To_Level
- (Self_Id : Task_ID;
- T : Task_ID;
- L : ATC_Level)
- renames
- Initialization.Locked_Abort_To_Level;
-
- procedure Defer_Abort (Self_Id : Task_ID) renames
- System.Tasking.Initialization.Defer_Abort;
-
- procedure Defer_Abort_Nestable (Self_Id : Task_ID) renames
- System.Tasking.Initialization.Defer_Abort_Nestable;
-
- procedure Undefer_Abort (Self_Id : Task_ID) renames
- System.Tasking.Initialization.Undefer_Abort;
-
- procedure Undefer_Abort_Nestable (Self_Id : Task_ID) renames
- System.Tasking.Initialization.Undefer_Abort_Nestable;
+ use Parameters;
+ use Tasking.Debug;
+ use Task_Primitives;
+ use Task_Primitives.Operations;
- procedure Wakeup_Entry_Caller
- (Self_Id : Task_ID;
- Entry_Call : Entry_Call_Link;
- New_State : Entry_Call_State)
- renames
- Initialization.Wakeup_Entry_Caller;
+ use System.Traces;
+ use System.Traces.Tasking;
- ----------------
- -- Abort_Task --
- ----------------
+ --------------------
+ -- Abort_One_Task --
+ --------------------
-- Similar to Locked_Abort_To_Level (Self_ID, T, 0), but:
- -- (1) caller should be holding no locks
+ -- (1) caller should be holding no locks except RTS_Lock when Single_Lock
-- (2) may be called for tasks that have not yet been activated
-- (3) always aborts whole task
- procedure Abort_One_Task
- (Self_ID : Task_ID;
- T : Task_ID)
- is
+ procedure Abort_One_Task (Self_ID : Task_ID; T : Task_ID) is
begin
+ if Parameters.Runtime_Traces then
+ Send_Trace_Info (T_Abort, Self_ID, T);
+ end if;
+
Write_Lock (T);
if T.Common.State = Unactivated then
@@ -124,7 +109,7 @@ package body System.Tasking.Utilities is
Cancel_Queued_Entry_Calls (T);
elsif T.Common.State /= Terminated then
- Locked_Abort_To_Level (Self_ID, T, 0);
+ Initialization.Locked_Abort_To_Level (Self_ID, T, 0);
end if;
Unlock (T);
@@ -148,27 +133,23 @@ package body System.Tasking.Utilities is
P : Task_ID;
begin
- -- ????
- -- Since this is a "potentially blocking operation", we should
- -- add a separate check here that we are not inside a protected
- -- operation.
-
- Defer_Abort_Nestable (Self_Id);
+ Initialization.Defer_Abort_Nestable (Self_Id);
-- ?????
-- Really should not be nested deferral here.
-- Patch for code generation error that defers abort before
-- evaluating parameters of an entry call (at least, timed entry
-- calls), and so may propagate an exception that causes abort
- -- to remain undeferred indefinitely. See C97404B. When all
+ -- to remain undeferred indefinitely. See C97404B. When all
-- such bugs are fixed, this patch can be removed.
+ Lock_RTS;
+
for J in Tasks'Range loop
C := Tasks (J);
Abort_One_Task (Self_Id, C);
end loop;
- Lock_All_Tasks_List;
C := All_Tasks_List;
while C /= null loop
@@ -188,17 +169,16 @@ package body System.Tasking.Utilities is
C := C.Common.All_Tasks_Link;
end loop;
- Unlock_All_Tasks_List;
- Undefer_Abort_Nestable (Self_Id);
+ Unlock_RTS;
+ Initialization.Undefer_Abort_Nestable (Self_Id);
end Abort_Tasks;
-------------------------------
-- Cancel_Queued_Entry_Calls --
-------------------------------
- -- Cancel any entry calls queued on target task. Call this only while
- -- holding T locked, and nothing more. This should only be called by T,
- -- unless T is a terminated previously unactivated task.
+ -- This should only be called by T, unless T is a terminated previously
+ -- unactivated task.
procedure Cancel_Queued_Entry_Calls (T : Task_ID) is
Next_Entry_Call : Entry_Call_Link;
@@ -214,7 +194,6 @@ package body System.Tasking.Utilities is
Queuing.Dequeue_Head (T.Entry_Queues (J), Entry_Call);
while Entry_Call /= null loop
-
-- Leave Entry_Call.Done = False, since this is cancelled
Caller := Entry_Call.Self;
@@ -223,7 +202,8 @@ package body System.Tasking.Utilities is
Level := Entry_Call.Level - 1;
Unlock (T);
Write_Lock (Entry_Call.Self);
- Wakeup_Entry_Caller (Self_Id, Entry_Call, Cancelled);
+ Initialization.Wakeup_Entry_Caller
+ (Self_Id, Entry_Call, Cancelled);
Unlock (Entry_Call.Self);
Write_Lock (T);
Entry_Call.State := Done;
@@ -277,27 +257,6 @@ package body System.Tasking.Utilities is
-- Make_Independent --
----------------------
- -- Move the current task to the outermost level (level 2) of the master
- -- hierarchy of the environment task. That is one level further out
- -- than normal tasks defined in library-level packages (level 3). The
- -- environment task will wait for level 3 tasks to terminate normally,
- -- then it will abort all the level 2 tasks. See Finalize_Global_Tasks
- -- procedure for more information.
-
- -- This is a dangerous operation, and should only be used on nested tasks
- -- or tasks that depend on any objects that might be finalized earlier than
- -- the termination of the environment task. It is for internal use by the
- -- GNARL, to prevent such internal server tasks from preventing a partition
- -- from terminating.
-
- -- Also note that the run time assumes that the parent of an independent
- -- task is the environment task. If this is not the case, Make_Independent
- -- will change the task's parent. This assumption is particularly
- -- important for master level completion and for the computation of
- -- Independent_Task_Count.
-
- -- See procedures Init_RTS and Finalize_Global_Tasks for related code.
-
procedure Make_Independent is
Self_Id : constant Task_ID := STPO.Self;
Environment_Task : constant Task_ID := STPO.Environment_Task;
@@ -309,7 +268,12 @@ package body System.Tasking.Utilities is
Known_Tasks (Self_Id.Known_Tasks_Index) := null;
end if;
- Defer_Abort (Self_Id);
+ Initialization.Defer_Abort (Self_Id);
+
+ if Single_Lock then
+ Lock_RTS;
+ end if;
+
Write_Lock (Environment_Task);
Write_Lock (Self_Id);
@@ -352,20 +316,19 @@ package body System.Tasking.Utilities is
end if;
Unlock (Environment_Task);
- Undefer_Abort (Self_Id);
+
+ if Single_Lock then
+ Unlock_RTS;
+ end if;
+
+ Initialization.Undefer_Abort (Self_Id);
end Make_Independent;
------------------
-- Make_Passive --
------------------
- -- Update counts to indicate current task is either terminated
- -- or accepting on a terminate alternative. Call holding no locks.
-
- procedure Make_Passive
- (Self_ID : Task_ID;
- Task_Completed : Boolean)
- is
+ procedure Make_Passive (Self_ID : Task_ID; Task_Completed : Boolean) is
C : Task_ID := Self_ID;
P : Task_ID := C.Common.Parent;
@@ -433,8 +396,7 @@ package body System.Tasking.Utilities is
-- is waiting (with zero Awake_Count) in Phase 2 of
-- Complete_Master.
- pragma Debug
- (Debug.Trace (Self_ID, "Make_Passive: Phase 2", 'M'));
+ pragma Debug (Debug.Trace (Self_ID, "Make_Passive: Phase 2", 'M'));
pragma Assert (P /= null);
@@ -474,7 +436,6 @@ package body System.Tasking.Utilities is
if P.Common.State = Master_Phase_2_Sleep
and then C.Master_of_Task = P.Master_Within
-
then
pragma Assert (P.Common.Wait_Count > 0);
P.Common.Wait_Count := P.Common.Wait_Count - 1;
@@ -538,8 +499,8 @@ package body System.Tasking.Utilities is
-- P has non-passive dependents.
- if P.Common.State = Master_Completion_Sleep and then
- C.Master_of_Task = P.Master_Within
+ if P.Common.State = Master_Completion_Sleep
+ and then C.Master_of_Task = P.Master_Within
then
pragma Debug
(Debug.Trace