Next: , Previous: C.7.2, Up: C.7


C.7.3 The Package Task_Termination

Static Semantics

1/2
The following language−defined library package exists:

2/2

     with Ada.Task_Identification;
     with Ada.Exceptions;
     package Ada.Task_Termination is   pragma Preelaborate(Task_Termination);

3/2

        type Cause_Of_Termination is (Normal, Abnormal, Unhandled_Exception);

4/2

        type Termination_Handler is access protected procedure
          (Cause in Cause_Of_Termination;
               in Ada.Task_Identification.Task_Id;
               in Ada.Exceptions.Exception_Occurrence);

5/2

        procedure Set_Dependents_Fallback_Handler
          (Handler: in Termination_Handler);
        function Current_Task_Fallback_Handler return Termination_Handler;

6/2

        procedure Set_Specific_Handler
          (T       in Ada.Task_Identification.Task_Id;
           Handler in Termination_Handler);
        function Specific_Handler (T Ada.Task_Identification.Task_Id)
           return Termination_Handler;

7/2

     end Ada.Task_Termination;
Dynamic Semantics

8/2
The type Termination_Handler identifies a protected procedure to be executed by the implementation when a task terminates. Such a protected procedure is called a handler. In all cases T identifies the task that is terminating. If the task terminates due to completing the last statement of its body, or as a result of waiting on a terminate alternative, then Cause is set to Normal and X is set to Null_Occurrence. If the task terminates because it is being aborted, then Cause is set to Abnormal and X is set to Null_Occurrence. If the task terminates because of an exception raised by the execution of its task_body, then Cause is set to Unhandled_Exception and X is set to the associated exception occurrence.

9/2
Each task has two termination handlers, a fall−back handler and a specific handler. The specific handler applies only to the task itself, while the fall−back handler applies only to the dependent tasks of the task. A handler is said to be set if it is associated with a non−null value of type Termination_Handler, and cleared otherwise. When a task is created, its specific handler and fall−back handler are cleared.

10/2
The procedure Set_Dependents_Fallback_Handler changes the fall−back handler for the calling task; if Handler is null, that fall−back handler is cleared, otherwise it is set to be Handler.all. If a fall−back handler had previously been set it is replaced.

11/2
The function Current_Task_Fallback_Handler returns the fall−back handler that is currently set for the calling task, if one is set; otherwise it returns null.

12/2
The procedure Set_Specific_Handler changes the specific handler for the task identified by T; if Handler is null, that specific handler is cleared, otherwise it is set to be Handler.all. If a specific handler had previously been set it is replaced.

13/2
The function Specific_Handler returns the specific handler that is currently set for the task identified by T, if one is set; otherwise it returns null.

14/2
As part of the finalization of a task_body, after performing the actions specified in 7.6 for finalization of a master, the specific handler for the task, if one is set, is executed. If the specific handler is cleared, a search for a fall−back handler proceeds by recursively following the master relationship for the task. If a task is found whose fall−back handler is set, that handler is executed; otherwise, no handler is executed.

15/2
For Set_Specific_Handler or Specific_Handler, Tasking_Error is raised if the task identified by T has already terminated. Program_Error is raised if the value of T is Ada.Task_Identification.Null_Task_Id.

16/2
An exception propagated from a handler that is invoked as part of the termination of a task has no effect.

Erroneous Execution

17/2
For a call of Set_Specific_Handler or Specific_Handler, if the task identified by T no longer exists, the execution of the program is erroneous.