diff options
author | Jose Ruiz <ruiz@adacore.com> | 2007-06-06 12:46:22 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2007-06-06 12:46:22 +0200 |
commit | 72fb810db9de1e8abdabefdb524567ad2691568e (patch) | |
tree | b73f1b3b905e546cc52e9c05f08a94134ce134ab /gcc/ada/s-tpobop.adb | |
parent | b9f3a4b07df15081483fd4caa5d1e29266917fa3 (diff) | |
download | gcc-72fb810db9de1e8abdabefdb524567ad2691568e.tar.gz |
s-taprob.adb (Unlock): Change the ceiling priority of the underlying lock, if needed.
2007-04-20 Jose Ruiz <ruiz@adacore.com>
Arnaud Charlet <charlet@adacore.com>
* s-taprob.adb (Unlock): Change the ceiling priority of the underlying
lock, if needed.
* s-taprop.ads (Set_Ceiling): Add this procedure to change the ceiling
priority associated to a lock.
* s-tpoben.adb ([Vulnerable_]Complete_Task, Lock_Entries): Relax
assertion to take into account case of no abort restriction.
(Initialize_Protection_Entries): Add initialization for the field
New_Ceiling associated to the protected object.
(Unlock_Entries): Change the ceiling priority of the underlying lock, if
needed.
* s-solita.adb (Get_Current_Excep): Moved back to s-tasini/s-tarest,
since this function needs to be set consistently with Update_Exception.
* s-tarest.adb (Get_Current_Excep): Moved back to s-tasini/s-tarest,
since this function needs to be set consistently with Update_Exception.
* s-taskin.ads: Update comments on
Interrupt_Server_Blocked_On_Event_Flag.
(Unbind_Handler): Fix handling of server_task wakeup
(Server_Task): Set self's state so that Unbind_Handler can take
appropriate actions.
(Common_ATCB): Now use a constant from System.Parameters to determine
the max size of the Task_Image field.
* s-tassta.adb (Task_Wrapper): Now pass the overflow guard to the
Initialize_Analyzer function.
([Vulnerable_]Complete_Task, Lock_Entries): Relax assertion to
take into account case of no abort restriction.
([Vulnerable_]Complete_Master): Modify assertion.
* s-tataat.adb (Finalize): Use the nestable versions of
Defer/Undefer_Abort.
* s-tpobop.adb (Protected_Entry_Call): Relax assertion.
* s-tpobop.ads: Update comments.
* s-tposen.adb (Protected_Single_Entry_Call): Call Lock_Entry instead
of locking the object manually, to avoid inconsistencies between
Lock/Unlock_Entry assertions.
* s-interr.ads, s-interr.adb (Server_Task): Fix race condition when
terminating
application and System.Parameters.No_Abort is True.
Update comments on Interrupt_Server_Blocked_On_Event_Flag.
(Unbind_Handler): Fix handling of server_task wakeup
(Server_Task): Set self's state so that Unbind_Handler can take
appropriate actions.
From-SVN: r125458
Diffstat (limited to 'gcc/ada/s-tpobop.adb')
-rw-r--r-- | gcc/ada/s-tpobop.adb | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/gcc/ada/s-tpobop.adb b/gcc/ada/s-tpobop.adb index 95d54af7552..867e51c8f81 100644 --- a/gcc/ada/s-tpobop.adb +++ b/gcc/ada/s-tpobop.adb @@ -7,7 +7,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1998-2006, Free Software Foundation, Inc. -- +-- Copyright (C) 1998-2007, 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- -- @@ -562,7 +562,7 @@ package body System.Tasking.Protected_Objects.Operations is Mode : Call_Modes; Block : out Communication_Block) is - Self_ID : constant Task_Id := STPO.Self; + Self_ID : constant Task_Id := STPO.Self; Entry_Call : Entry_Call_Link; Initially_Abortable : Boolean; Ceiling_Violation : Boolean; @@ -591,14 +591,17 @@ package body System.Tasking.Protected_Objects.Operations is (Program_Error'Identity, "potentially blocking operation"); end if; - Initialization.Defer_Abort (Self_ID); + -- Self_ID.Deferral_Level should be 0, except when called from Finalize, + -- where abort is already deferred. + + Initialization.Defer_Abort_Nestable (Self_ID); Lock_Entries (Object, Ceiling_Violation); if Ceiling_Violation then -- Failed ceiling check - Initialization.Undefer_Abort (Self_ID); + Initialization.Undefer_Abort_Nestable (Self_ID); raise Program_Error; end if; @@ -651,7 +654,7 @@ package body System.Tasking.Protected_Objects.Operations is Block.Enqueued := False; Block.Cancelled := Entry_Call.State = Cancelled; - Initialization.Undefer_Abort (Self_ID); + Initialization.Undefer_Abort_Nestable (Self_ID); Entry_Calls.Check_Exception (Self_ID, Entry_Call); return; @@ -698,7 +701,7 @@ package body System.Tasking.Protected_Objects.Operations is null; end if; - Initialization.Undefer_Abort (Self_ID); + Initialization.Undefer_Abort_Nestable (Self_ID); Entry_Calls.Check_Exception (Self_ID, Entry_Call); end Protected_Entry_Call; |