Справочник по Ada 2012
C.7.3 Пакет Task_Termination
Статическая семантика
Существует следующий пакет библиотеки, определенный языком:
with Ada.Task_Identification;
with Ada.Exceptions;
package Ada.Task_Termination is
pragma Preelaborate(Task_Termination);
with Ada.Exceptions;
package Ada.Task_Termination is
pragma Preelaborate(Task_Termination);
type Cause_Of_Termination is (Normal, Abnormal, Unhandled_Exception);
type Termination_Handler is access protected procedure
(Cause : in Cause_Of_Termination;
T : in Ada.Task_Identification.Task_Id;
X : in Ada.Exceptions.Exception_Occurrence);
(Cause : in Cause_Of_Termination;
T : in Ada.Task_Identification.Task_Id;
X : in Ada.Exceptions.Exception_Occurrence);
procedure Set_Dependents_Fallback_Handler
(Handler: in Termination_Handler);
function Current_Task_Fallback_Handler return Termination_Handler;
(Handler: in Termination_Handler);
function Current_Task_Fallback_Handler return Termination_Handler;
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;
(T : in Ada.Task_Identification.Task_Id;
Handler : in Termination_Handler);
function Specific_Handler (T : Ada.Task_Identification.Task_Id)
return Termination_Handler;
end Ada.Task_Termination;
Динамическая семантика
Тип Termination_Handler идентифицирует защищенную процедуру, которая должна быть выполнена реализацией при завершении задачи. Такая защищенная процедура называется обработчиком. Во всех случаях T идентифицирует задачу, которая завершается. Если задача завершается выполнением последнего оператора своего тела или в результате ожидания альтернативы завершения, и завершение задачи выполняется нормально, то Cause устанавливается в Normal, а X — в Null_Occurrence. Если задача завершается, потому что она прерывается, то Cause устанавливается в Abnormal; X устанавливается в Null_Occurrence, если завершение задачи выполняется нормально. Если задача завершается из-за исключения, поднятого при выполнении её task_body, то Cause устанавливается в Unhandled_Exception; X устанавливается в соответствующее возникновение исключения, если завершение задачи выполняется нормально. Независимо от того, как завершается задача, если завершение задачи распространяет исключение, то Cause — это либо Unhandled_Exception, либо Abnormal, а X — это возникновение исключения, которое идентифицирует исключение Program_Error.
Каждая задача имеет два обработчика завершения: обработчик по умолчанию и специфический обработчик. Специфический обработчик применяется только к самой задаче, а обработчик по умолчанию — только к зависимым задачам задачи. Обработчик считается установленным, если он связан с ненулевым значением типа Termination_Handler, и сброшенным в противном случае. При создании задачи её специфический обработчик и обработчик по умолчанию сбрасываются.
Процедура Set_Dependents_Fallback_Handler изменяет обработчик по умолчанию для вызывающей задачи: если Handler — null, то этот обработчик по умолчанию сбрасывается; в противном случае он устанавливается в Handler.all. Если ранее обработчик по умолчанию был установлен, он заменяется.
Функция Current_Task_Fallback_Handler возвращает обработчик по умолчанию, который в данный момент установлен для вызывающей задачи, если он установлен; в противном случае она возвращает null.
Процедура Set_Specific_Handler изменяет специфический обработчик для задачи, идентифицированной T: если Handler — null, то этот специфический обработчик сбрасывается; в противном случае он устанавливается в Handler.all. Если ранее специфический обработчик был установлен, он заменяется.
Функция Specific_Handler возвращает специфический обработчик, который в данный момент установлен для задачи, идентифицированной T, если он установлен; в противном случае она возвращает null.
В рамках завершения task_body, после выполнения действий, указанных в 7.6 для завершения мастера, специфический обработчик задачи, если он установлен, выполняется. Если специфический обработчик сброшен, выполняется поиск обработчика по умолчанию путём рекурсивного следования по отношениям мастер-задача. Если найдена задача, у которой обработчик по умолчанию установлен, этот обработчик выполняется; в противном случае обработчик не выполняется.
Для Set_Specific_Handler или Specific_Handler, Tasking_Error поднимается, если задача, идентифицированная T, уже завершена. Program_Error поднимается, если значение T равно Ada.Task_Identification.Null_Task_Id.
Исключение, распространяемое из обработчика, который вызывается в рамках завершения задачи, не оказывает никакого эффекта.
Ошибочное выполнение
Для вызова Set_Specific_Handler или Specific_Handler, если задача, идентифицированная T, больше не существует, выполнение программы ошибочно.