C.7.3 The Package Task_Termination
The following language-defined
library package exists:
(Normal, Abnormal, Unhandled_Exception);
Termination_Handler is access protected procedure
(Cause : in
T : in
X : in
(T : in
Handler : in
Specific_Handler (T : Ada.Task_Identification.Task_Id)
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
task has two termination handlers, a fall-back handler
and a specific
. 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
a task is created, its specific handler and fall-back handler are cleared.
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.
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.
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.
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.
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.
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.
An exception propagated from a handler that is invoked
as part of the termination of a task has no effect.
For a call of Set_Specific_Handler or Specific_Handler,
if the task identified by T no longer exists, the execution of the program