summaryrefslogtreecommitdiff
path: root/gcc/ada/5otaprop.adb
diff options
context:
space:
mode:
authorbosch <bosch@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-08 20:11:04 +0000
committerbosch <bosch@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-08 20:11:04 +0000
commitf15731c43ae5e8cea424ea40f905c19afa1bd2e4 (patch)
treeb584a79288c93215b05fb451943291ccd039388b /gcc/ada/5otaprop.adb
parent1d347c236ad815c77bd345611ed221b0bd6091de (diff)
downloadgcc-f15731c43ae5e8cea424ea40f905c19afa1bd2e4.tar.gz
* 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] git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50451 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/5otaprop.adb')
-rw-r--r--gcc/ada/5otaprop.adb292
1 files changed, 181 insertions, 111 deletions
diff --git a/gcc/ada/5otaprop.adb b/gcc/ada/5otaprop.adb
index b728f0bccda..a71a09db015 100644
--- a/gcc/ada/5otaprop.adb
+++ b/gcc/ada/5otaprop.adb
@@ -6,9 +6,9 @@
-- --
-- B o d y --
-- --
--- $Revision: 1.1 $
+-- $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). --
-- --
------------------------------------------------------------------------------
@@ -91,29 +90,29 @@ package body System.Task_Primitives.Operations is
use Interfaces.OS2Lib.Errors;
use Interfaces.OS2Lib.Threads;
use Interfaces.OS2Lib.Synchronization;
+ use System.Parameters;
use System.Tasking.Debug;
use System.Tasking;
use System.OS_Interface;
use Interfaces.C;
use System.OS_Primitives;
- ----------------------
- -- Local Constants --
- ----------------------
+ ---------------------
+ -- Local Constants --
+ ---------------------
Max_Locks_Per_Task : constant := 100;
Suppress_Owner_Check : constant Boolean := False;
- ------------------
- -- Local Types --
- ------------------
+ -----------------
+ -- Local Types --
+ -----------------
- type Microseconds is new IC.long;
subtype Lock_Range is Integer range 0 .. Max_Locks_Per_Task;
- ------------------
- -- Local Data --
- ------------------
+ -----------------
+ -- Local Data --
+ -----------------
-- The OS/2 DosAllocThreadLocalMemory API is used to allocate our TCB_Ptr.
@@ -138,8 +137,10 @@ package body System.Task_Primitives.Operations is
type PPTLD is access all Access_Thread_Local_Data;
- All_Tasks_L : aliased System.Task_Primitives.RTS_Lock;
- -- See comments on locking rules in System.Tasking (spec).
+ Single_RTS_Lock : aliased RTS_Lock;
+ -- This is a lock to allow only one thread of control in the RTS at
+ -- a time; it is used to execute in mutual exclusion from all other tasks.
+ -- Used mainly in Single_Lock mode, but also to protect All_Tasks_List
Environment_Task_ID : Task_ID;
-- A variable to hold Task_ID for the environment task.
@@ -192,15 +193,18 @@ package body System.Task_Primitives.Operations is
-- handler or to change the execution context of the thread.
-- So asynchonous transfer of control is not supported.
- -------------------
- -- Stack_Guard --
- -------------------
+ -----------------
+ -- Stack_Guard --
+ -----------------
-- The underlying thread system sets a guard page at the
-- bottom of a thread stack, so nothing is needed.
-- ??? Check the comment above
procedure Stack_Guard (T : ST.Task_ID; On : Boolean) is
+ pragma Warnings (Off, T);
+ pragma Warnings (Off, On);
+
begin
null;
end Stack_Guard;
@@ -220,7 +224,6 @@ package body System.Task_Primitives.Operations is
function Self return Task_ID is
Self_ID : Task_ID renames Thread_Local_Data_Ptr.Self_ID;
-
begin
-- Check that the thread local data has been initialized.
@@ -252,6 +255,8 @@ package body System.Task_Primitives.Operations is
end Initialize_Lock;
procedure Initialize_Lock (L : access RTS_Lock; Level : Lock_Level) is
+ pragma Warnings (Off, Level);
+
begin
if DosCreateMutexSem
(ICS.Null_Ptr, L.Mutex'Unchecked_Access, 0, False32) /= NO_ERROR
@@ -312,44 +317,52 @@ package body System.Task_Primitives.Operations is
L.Owner_ID := Self_ID.all'Address;
end Write_Lock;
- procedure Write_Lock (L : access RTS_Lock) is
- Self_ID : constant Task_ID := Thread_Local_Data_Ptr.Self_ID;
- Old_Priority : constant Any_Priority :=
- Self_ID.Common.LL.Current_Priority;
+ procedure Write_Lock
+ (L : access RTS_Lock; Global_Lock : Boolean := False)
+ is
+ Self_ID : Task_ID;
+ Old_Priority : Any_Priority;
begin
- -- Increase priority before getting the lock
- -- to prevent priority inversion
+ if not Single_Lock or else Global_Lock then
+ Self_ID := Thread_Local_Data_Ptr.Self_ID;
+ Old_Priority := Self_ID.Common.LL.Current_Priority;
- Thread_Local_Data_Ptr.Lock_Prio_Level :=
- Thread_Local_Data_Ptr.Lock_Prio_Level + 1;
+ -- Increase priority before getting the lock
+ -- to prevent priority inversion
- if L.Priority > Old_Priority then
- Set_Temporary_Priority (Self_ID, L.Priority);
- end if;
+ Thread_Local_Data_Ptr.Lock_Prio_Level :=
+ Thread_Local_Data_Ptr.Lock_Prio_Level + 1;
- -- Request the lock and then update the lock owner data
+ if L.Priority > Old_Priority then
+ Set_Temporary_Priority (Self_ID, L.Priority);
+ end if;
- Must_Not_Fail (DosRequestMutexSem (L.Mutex, SEM_INDEFINITE_WAIT));
- L.Owner_Priority := Old_Priority;
- L.Owner_ID := Self_ID.all'Address;
+ -- Request the lock and then update the lock owner data
+
+ Must_Not_Fail (DosRequestMutexSem (L.Mutex, SEM_INDEFINITE_WAIT));
+ L.Owner_Priority := Old_Priority;
+ L.Owner_ID := Self_ID.all'Address;
+ end if;
end Write_Lock;
procedure Write_Lock (T : Task_ID) is
begin
- -- Request the lock and then update the lock owner data
+ if not Single_Lock then
+ -- Request the lock and then update the lock owner data
- Must_Not_Fail
- (DosRequestMutexSem (T.Common.LL.L.Mutex, SEM_INDEFINITE_WAIT));
- T.Common.LL.L.Owner_ID := Null_Address;
+ Must_Not_Fail
+ (DosRequestMutexSem (T.Common.LL.L.Mutex, SEM_INDEFINITE_WAIT));
+ T.Common.LL.L.Owner_ID := Null_Address;
+ end if;
end Write_Lock;
---------------
-- Read_Lock --
---------------
- procedure Read_Lock (L : access Lock; Ceiling_Violation : out Boolean)
- renames Write_Lock;
+ procedure Read_Lock
+ (L : access Lock; Ceiling_Violation : out Boolean) renames Write_Lock;
------------
-- Unlock --
@@ -383,53 +396,63 @@ package body System.Task_Primitives.Operations is
end if;
end Unlock;
- procedure Unlock (L : access RTS_Lock) is
- Self_ID : constant Task_ID := Thread_Local_Data_Ptr.Self_ID;
- Old_Priority : constant Any_Priority := L.Owner_Priority;
+ procedure Unlock (L : access RTS_Lock; Global_Lock : Boolean := False) is
+ Self_ID : Task_ID;
+ Old_Priority : Any_Priority;
begin
- -- Check that this task holds the lock
+ if not Single_Lock or else Global_Lock then
+ Self_ID := Thread_Local_Data_Ptr.Self_ID;
+ Old_Priority := L.Owner_Priority;
+ -- Check that this task holds the lock
- pragma Assert (Suppress_Owner_Check
- or else L.Owner_ID = Self_ID.all'Address);
+ pragma Assert (Suppress_Owner_Check
+ or else L.Owner_ID = Self_ID.all'Address);
- -- Upate the owner data
+ -- Upate the owner data
- L.Owner_ID := Null_Address;
+ L.Owner_ID := Null_Address;
- -- Do the actual unlocking. No more references
- -- to owner data of L after this point.
+ -- Do the actual unlocking. No more references
+ -- to owner data of L after this point.
- Must_Not_Fail (DosReleaseMutexSem (L.Mutex));
+ Must_Not_Fail (DosReleaseMutexSem (L.Mutex));
- -- Reset priority after unlocking to avoid priority inversion
- Thread_Local_Data_Ptr.Lock_Prio_Level :=
- Thread_Local_Data_Ptr.Lock_Prio_Level - 1;
+ -- Reset priority after unlocking to avoid priority inversion
+ Thread_Local_Data_Ptr.Lock_Prio_Level :=
+ Thread_Local_Data_Ptr.Lock_Prio_Level - 1;
- if L.Priority /= Old_Priority then
- Set_Temporary_Priority (Self_ID, Old_Priority);
+ if L.Priority /= Old_Priority then
+ Set_Temporary_Priority (Self_ID, Old_Priority);
+ end if;
end if;
end Unlock;
procedure Unlock (T : Task_ID) is
begin
- -- Check the owner data
+ if not Single_Lock then
+ -- Check the owner data
- pragma Assert (Suppress_Owner_Check
- or else T.Common.LL.L.Owner_ID = Null_Address);
+ pragma Assert (Suppress_Owner_Check
+ or else T.Common.LL.L.Owner_ID = Null_Address);
- -- Do the actual unlocking. No more references
- -- to owner data of T.Common.LL.L after this point.
+ -- Do the actual unlocking. No more references
+ -- to owner data of T.Common.LL.L after this point.
- Must_Not_Fail (DosReleaseMutexSem (T.Common.LL.L.Mutex));
+ Must_Not_Fail (DosReleaseMutexSem (T.Common.LL.L.Mutex));
+ end if;
end Unlock;
-----------
-- Sleep --
-----------
- procedure Sleep (Self_ID : Task_ID;
- Reason : System.Tasking.Task_States) is
+ procedure Sleep
+ (Self_ID : Task_ID;
+ Reason : System.Tasking.Task_States)
+ is
+ pragma Warnings (Off, Reason);
+
Count : aliased ULONG; -- Used to store dummy result
begin
@@ -437,7 +460,12 @@ package body System.Task_Primitives.Operations is
Sem_Must_Not_Fail
(DosResetEventSem (Self_ID.Common.LL.CV, Count'Unchecked_Access));
- Unlock (Self_ID);
+
+ if Single_Lock then
+ Unlock_RTS;
+ else
+ Unlock (Self_ID);
+ end if;
-- No problem if we are interrupted here.
-- If the condition is signaled, DosWaitEventSem will simply not block.
@@ -447,7 +475,11 @@ package body System.Task_Primitives.Operations is
-- Since L was previously accquired, lock operation should not fail.
- Write_Lock (Self_ID);
+ if Single_Lock then
+ Lock_RTS;
+ else
+ Write_Lock (Self_ID);
+ end if;
end Sleep;
-----------------
@@ -472,6 +504,8 @@ package body System.Task_Primitives.Operations is
Timedout : out Boolean;
Yielded : out Boolean)
is
+ pragma Warnings (Off, Reason);
+
Check_Time : constant Duration := OSP.Monotonic_Clock;
Rel_Time : Duration;
Abs_Time : Duration;
@@ -485,7 +519,12 @@ package body System.Task_Primitives.Operations is
Sem_Must_Not_Fail
(DosResetEventSem (Self_ID.Common.LL.CV,
Count'Unchecked_Access));
- Unlock (Self_ID);
+
+ if Single_Lock then
+ Unlock_RTS;
+ else
+ Unlock (Self_ID);
+ end if;
Timedout := True;
Yielded := False;
@@ -529,7 +568,11 @@ package body System.Task_Primitives.Operations is
-- Ensure post-condition
- Write_Lock (Self_ID);
+ if Single_Lock then
+ Lock_RTS;
+ else
+ Write_Lock (Self_ID);
+ end if;
if Timedout then
Sem_Must_Not_Fail (DosPostEventSem (Self_ID.Common.LL.CV));
@@ -550,7 +593,7 @@ package body System.Task_Primitives.Operations is
Abs_Time : Duration;
Timedout : Boolean := True;
Time_Out : ULONG;
- Result : APIRET;
+ Result : APIRET;
Count : aliased ULONG; -- Used to store dummy result
begin
@@ -559,14 +602,24 @@ package body System.Task_Primitives.Operations is
-- check for pending abort and priority change below! :(
SSL.Abort_Defer.all;
- Write_Lock (Self_ID);
+
+ if Single_Lock then
+ Lock_RTS;
+ else
+ Write_Lock (Self_ID);
+ end if;
-- Must reset Cond BEFORE Self_ID is unlocked.
Sem_Must_Not_Fail
(DosResetEventSem (Self_ID.Common.LL.CV,
Count'Unchecked_Access));
- Unlock (Self_ID);
+
+ if Single_Lock then
+ Unlock_RTS;
+ else
+ Unlock (Self_ID);
+ end if;
if Mode = Relative then
Rel_Time := Time;
@@ -578,6 +631,7 @@ package body System.Task_Primitives.Operations is
if Rel_Time > 0.0 then
Self_ID.Common.State := Delay_Sleep;
+
loop
if Self_ID.Pending_Priority_Change then
Self_ID.Pending_Priority_Change := False;
@@ -599,15 +653,22 @@ package body System.Task_Primitives.Operations is
Timedout := Result = ERROR_TIMEOUT;
end if;
- -- Ensure post-condition
-
- Write_Lock (Self_ID);
+ if Single_Lock then
+ Lock_RTS;
+ else
+ Write_Lock (Self_ID);
+ end if;
if Timedout then
Sem_Must_Not_Fail (DosPostEventSem (Self_ID.Common.LL.CV));
end if;
- Unlock (Self_ID);
+ if Single_Lock then
+ Unlock_RTS;
+ else
+ Unlock (Self_ID);
+ end if;
+
System.OS_Interface.Yield;
SSL.Abort_Undefer.all;
end Timed_Delay;
@@ -617,6 +678,7 @@ package body System.Task_Primitives.Operations is
------------
procedure Wakeup (T : Task_ID; Reason : System.Tasking.Task_States) is
+ pragma Warnings (Off, Reason);
begin
Sem_Must_Not_Fail (DosPostEventSem (T.Common.LL.CV));
end Wakeup;
@@ -659,7 +721,6 @@ package body System.Task_Primitives.Operations is
end if;
if Delta_Priority /= 0 then
-
-- ??? There is a race-condition here
-- The TCB is updated before the system call to make
-- pre-emption in the critical section less likely.
@@ -679,9 +740,12 @@ package body System.Task_Primitives.Operations is
------------------
procedure Set_Priority
- (T : Task_ID;
- Prio : System.Any_Priority;
- Loss_Of_Inheritance : Boolean := False) is
+ (T : Task_ID;
+ Prio : System.Any_Priority;
+ Loss_Of_Inheritance : Boolean := False)
+ is
+ pragma Warnings (Off, Loss_Of_Inheritance);
+
begin
T.Common.Current_Priority := Prio;
Set_Temporary_Priority (T, Prio);
@@ -702,21 +766,22 @@ package body System.Task_Primitives.Operations is
procedure Enter_Task (Self_ID : Task_ID) is
begin
-
-- Initialize thread local data. Must be done first.
Thread_Local_Data_Ptr.Self_ID := Self_ID;
Thread_Local_Data_Ptr.Lock_Prio_Level := 0;
- Lock_All_Tasks_List;
- for I in Known_Tasks'Range loop
- if Known_Tasks (I) = null then
- Known_Tasks (I) := Self_ID;
- Self_ID.Known_Tasks_Index := I;
+ Lock_RTS;
+
+ for J in Known_Tasks'Range loop
+ if Known_Tasks (J) = null then
+ Known_Tasks (J) := Self_ID;
+ Self_ID.Known_Tasks_Index := J;
exit;
end if;
end loop;
- Unlock_All_Tasks_List;
+
+ Unlock_RTS;
-- For OS/2, we can set Self_ID.Common.LL.Thread in
-- Create_Task, since the thread is created suspended.
@@ -725,7 +790,6 @@ package body System.Task_Primitives.Operations is
-- has been initialized.
-- .... Do we need to do anything with signals for OS/2 ???
- null;
end Enter_Task;
--------------
@@ -746,8 +810,12 @@ package body System.Task_Primitives.Operations is
if DosCreateEventSem (ICS.Null_Ptr,
Self_ID.Common.LL.CV'Unchecked_Access, 0, True32) = NO_ERROR
then
- if DosCreateMutexSem (ICS.Null_Ptr,
- Self_ID.Common.LL.L.Mutex'Unchecked_Access, 0, False32) /= NO_ERROR
+ if not Single_Lock
+ and then DosCreateMutexSem
+ (ICS.Null_Ptr,
+ Self_ID.Common.LL.L.Mutex'Unchecked_Access,
+ 0,
+ False32) /= NO_ERROR
then
Succeeded := False;
Must_Not_Fail (DosCloseEventSem (Self_ID.Common.LL.CV));
@@ -755,8 +823,6 @@ package body System.Task_Primitives.Operations is
Succeeded := True;
end if;
- pragma Assert (Self_ID.Common.LL.L.Mutex /= 0);
-
-- We now want to do the equivalent of:
-- Initialize_Lock
@@ -774,7 +840,7 @@ package body System.Task_Primitives.Operations is
Succeeded := False;
end if;
- -- Note: at one time we had anb exception handler here, whose code
+ -- Note: at one time we had an exception handler here, whose code
-- was as follows:
-- exception
@@ -789,7 +855,6 @@ package body System.Task_Primitives.Operations is
-- result in messing with Jmpbuf values too early. If and when we get
-- switched entirely to the new zero-cost exception scheme, we could
-- put this handler back in!
-
end Initialize_TCB;
-----------------
@@ -889,12 +954,18 @@ package body System.Task_Primitives.Operations is
procedure Free is new
Unchecked_Deallocation (Ada_Task_Control_Block, Task_ID);
+
begin
Must_Not_Fail (DosCloseEventSem (T.Common.LL.CV));
- Finalize_Lock (T.Common.LL.L'Unchecked_Access);
+
+ if not Single_Lock then
+ Finalize_Lock (T.Common.LL.L'Unchecked_Access);
+ end if;
+
if T.Known_Tasks_Index /= -1 then
Known_Tasks (T.Known_Tasks_Index) := null;
end if;
+
Free (Tmp);
end Finalize_TCB;
@@ -916,6 +987,8 @@ package body System.Task_Primitives.Operations is
----------------
procedure Abort_Task (T : Task_ID) is
+ pragma Warnings (Off, T);
+
begin
null;
@@ -956,23 +1029,23 @@ package body System.Task_Primitives.Operations is
return Environment_Task_ID;
end Environment_Task;
- -------------------------
- -- Lock_All_Tasks_List --
- -------------------------
+ --------------
+ -- Lock_RTS --
+ --------------
- procedure Lock_All_Tasks_List is
+ procedure Lock_RTS is
begin
- Write_Lock (All_Tasks_L'Access);
- end Lock_All_Tasks_List;
+ Write_Lock (Single_RTS_Lock'Access, Global_Lock => True);
+ end Lock_RTS;
- ---------------------------
- -- Unlock_All_Tasks_List --
- ---------------------------
+ ----------------
+ -- Unlock_RTS --
+ ----------------
- procedure Unlock_All_Tasks_List is
+ procedure Unlock_RTS is
begin
- Unlock (All_Tasks_L'Access);
- end Unlock_All_Tasks_List;
+ Unlock (Single_RTS_Lock'Access, Global_Lock => True);
+ end Unlock_RTS;
------------------
-- Suspend_Task --
@@ -1010,11 +1083,10 @@ package body System.Task_Primitives.Operations is
procedure Initialize (Environment_Task : Task_ID) is
Succeeded : Boolean;
-
begin
Environment_Task_ID := Environment_Task;
- Initialize_Lock (All_Tasks_L'Access, All_Tasks_Level);
+ Initialize_Lock (Single_RTS_Lock'Access, RTS_Lock_Level);
-- Initialize the lock used to synchronize chain of all ATCBs.
-- Set ID of environment task.
@@ -1047,7 +1119,6 @@ package body System.Task_Primitives.Operations is
-- Insert here any other special
-- initialization needed for the environment task.
-
end Initialize;
begin
@@ -1062,5 +1133,4 @@ begin
Thread_Local_Data_Ptr.Self_ID := null;
Thread_Local_Data_Ptr.Lock_Prio_Level := 0;
-
end System.Task_Primitives.Operations;