Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

C.7.3 Пакет Task_Termination

Статическая семантика

Ниже представлен пакет библиотеки, определённый языком:
with Ada.Task_Identification;
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);
procedure Set_Dependents_Fallback_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;
end Ada.Task_Termination;

Динамическая семантика

Тип Termination_Handler идентифицирует защищённую процедуру, которая должна быть выполнена реализацией при завершении задачи. Такая защищённая процедура называется обработчиком. Во всех случаях T идентифицирует задачу, которая завершается. Если задача завершается выполнением последней инструкции её тела или в результате ожидания в альтернативе завершения, то Cause устанавливается в Normal, а X — в Null_Occurrence. Если задача завершается из-за прерывания, то Cause устанавливается в Abnormal, а X — в Null_Occurrence. Если задача завершается из-за исключения, сгенерированного при выполнении её task_body, то Cause устанавливается в Unhandled_Exception, а X — в соответствующей событии исключения.
Каждая задача имеет два обработчика завершения, обработчик по умолчанию и специфический обработчик. Специфический обработчик применяется только к самой задаче, а обработчик по умолчанию — только к зависимым задачам задачи. Обработчик считается установленным, если он связан с ненулевым значением типа 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, больше не существует, выполнение программы является ошибочным.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API