Patchwork [Ada] ignore exceptions in termination handlers

login
register
mail settings
Submitter Arnaud Charlet
Date Aug. 29, 2011, 2:18 p.m.
Message ID <20110829141804.GA27082@adacore.com>
Download mbox | patch
Permalink /patch/112065/
State New
Headers show

Comments

Arnaud Charlet - Aug. 29, 2011, 2:18 p.m.
This patch causes exceptions propagated by the termination handler to be
ignored, as required by the Ada RM. The following test should run to completion
silently:
with Ada.Task_Identification;
with Ada.Task_Termination; use Ada.Task_Termination;
with Ada.Exceptions;
package Task_Term_Exc is
   task T;
end Task_Term_Exc;
package body Task_Term_Exc is

   Some_Error : exception;

   protected Prot is
      procedure Termination_Handler
        (Cause : in Cause_Of_Termination;
         T     : in Ada.Task_Identification.Task_Id;
         X     : in Ada.Exceptions.Exception_Occurrence);
   end Prot;

   protected body Prot is
      procedure Termination_Handler
        (Cause : in Cause_Of_Termination;
         T     : in Ada.Task_Identification.Task_Id;
         X     : in Ada.Exceptions.Exception_Occurrence) is
      begin
         raise Some_Error;
      end Termination_Handler;
   end Prot;

   task body T is
   begin
      Set_Specific_Handler (T'Identity, Prot.Termination_Handler'Access);
   end T;

end Task_Term_Exc;

----
date: 2011/05/27 18:00:38;  author: duff;

The test has no main procedure, so must be compiled with -z,
as in "gnatmake -q -f -z -gnat2012 task_term_exc.adb".

Tested on x86_64-pc-linux-gnu, committed on trunk

2011-08-29  Bob Duff  <duff@adacore.com>

	* s-tassta.adb (Task_Wrapper): Handle and ignore exceptions propagated
	by the termination handler.

Patch

Index: s-tassta.adb
===================================================================
--- s-tassta.adb	(revision 178155)
+++ s-tassta.adb	(working copy)
@@ -1324,7 +1324,14 @@ 
       --  Execute the task termination handler if we found it
 
       if TH /= null then
-         TH.all (Cause, Self_ID, EO);
+         begin
+            TH.all (Cause, Self_ID, EO);
+
+         exception
+            when others =>
+               --  RM-C.7.3 requires these exceptions to be ignored
+               null;
+         end;
       end if;
 
       if System.Stack_Usage.Is_Enabled then