diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2007-04-06 11:27:53 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2007-04-06 11:27:53 +0200 |
commit | 6d770ce515058de8275fc7197d0fb62c0d6431b5 (patch) | |
tree | 8d96a1513b6e4f34222f97b467c4b0b1836fe79b /gcc/ada | |
parent | f28573f4914479bb9f9ca96f3a1436dcadb36c51 (diff) | |
download | gcc-6d770ce515058de8275fc7197d0fb62c0d6431b5.zip gcc-6d770ce515058de8275fc7197d0fb62c0d6431b5.tar.gz gcc-6d770ce515058de8275fc7197d0fb62c0d6431b5.tar.bz2 |
s-tpobop.adb (Exceptional_Complete_Entry_Body): Undefer abortion before propagating exception.
* s-tpobop.adb (Exceptional_Complete_Entry_Body): Undefer abortion
before propagating exception.
From-SVN: r123601
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/s-tpobop.adb | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/ada/s-tpobop.adb b/gcc/ada/s-tpobop.adb index b8bfc9a..95d54af 100644 --- a/gcc/ada/s-tpobop.adb +++ b/gcc/ada/s-tpobop.adb @@ -272,6 +272,8 @@ package body System.Tasking.Protected_Objects.Operations is pragma Import (C, Transfer_Occurrence, "__gnat_transfer_occurrence"); Entry_Call : constant Entry_Call_Link := Object.Call_In_Progress; + Self_Id : Task_Id; + begin pragma Debug (Debug.Trace (STPO.Self, "Exceptional_Complete_Entry_Body", 'P')); @@ -285,9 +287,15 @@ package body System.Tasking.Protected_Objects.Operations is Entry_Call.Exception_To_Raise := Ex; if Ex /= Ada.Exceptions.Null_Id then + -- An exception was raised and abort was deferred, so adjust + -- before propagating, otherwise the task will stay with deferral + -- enabled for its remaining life. + + Self_Id := STPO.Self; + Initialization.Undefer_Abort_Nestable (Self_Id); Transfer_Occurrence (Entry_Call.Self.Common.Compiler_Data.Current_Excep'Access, - STPO.Self.Common.Compiler_Data.Current_Excep); + Self_Id.Common.Compiler_Data.Current_Excep); end if; -- Wakeup_Entry_Caller will be called from PO_Do_Or_Queue or |