Руководство по Ada (Ada 2022)
C.7.1 Пакет Task_Identification
Статическая семантика
Существует следующий определяемый языком библиотечный пакет:
package Ada.Task_Identification
with Preelaborate, Nonblocking, Global => in out synchronized is
type Task_Id is private
with Preelaborable_Initialization;
Null_Task_Id : constant Task_Id;
function "=" (Left, Right : Task_Id) return Boolean;
with Preelaborate, Nonblocking, Global => in out synchronized is
type Task_Id is private
with Preelaborable_Initialization;
Null_Task_Id : constant Task_Id;
function "=" (Left, Right : Task_Id) return Boolean;
function Image (T : Task_Id) return String;
function Current_Task return Task_Id;
function Environment_Task return Task_Id;
procedure Abort_Task (T : in Task_Id)
with Nonblocking => False;
function Current_Task return Task_Id;
function Environment_Task return Task_Id;
procedure Abort_Task (T : in Task_Id)
with Nonblocking => False;
function Is_Terminated (T : Task_Id) return Boolean;
function Is_Callable (T : Task_Id) return Boolean;
function Activation_Is_Complete (T : Task_Id) return Boolean;
private
... -- не определено языком
end Ada.Task_Identification;
function Is_Callable (T : Task_Id) return Boolean;
function Activation_Is_Complete (T : Task_Id) return Boolean;
private
... -- не определено языком
end Ada.Task_Identification;
Динамическая семантика
Значение типа Task_Id идентифицирует существующую задачу. Константа Null_Task_Id не идентифицирует никакую задачу. Каждый объект типа Task_Id инициализируется по умолчанию значением Null_Task_Id.
Функция "=" возвращает True тогда и только тогда, когда Left и Right идентифицируют одну и ту же задачу или обе имеют значение Null_Task_Id.
Функция Image возвращает определяемую реализацией строку, которая идентифицирует T. Если T равно Null_Task_Id, Image возвращает пустую строку.
Функция Current_Task возвращает значение, которое идентифицирует вызывающую задачу.
Функция Environment_Task возвращает значение, которое идентифицирует задачу окружения.
Эффект Abort_Task такой же, как и оператор abort_statement для задачи, идентифицируемой T. Кроме того, если T идентифицирует задачу окружения, вся партиция прерывается, см. E.1.
Функции Is_Terminated и Is_Callable возвращают значение соответствующего атрибута задачи, идентифицируемой T.
Функция Activation_Is_Complete возвращает True, если задача, идентифицируемая T, завершила свою активацию (успешно или нет). В противном случае возвращается False. Если T идентифицирует задачу окружения, Activation_Is_Complete возвращает True после завершения разработки library_itemов партиции.
Для префикса T типа задачи (после любого неявного разыменования) определен следующий атрибут:
T'Identity
Возвращает значение типа Task_Id, которое идентифицирует задачу, обозначенную T.
Для префикса E, обозначающего entry_declaration, определен следующий атрибут:
E'Caller
Возвращает значение типа Task_Id, которое идентифицирует задачу, вызов которой сейчас обслуживается. Использование этого атрибута разрешено только внутри оператора accept_statement или entry_body после entry_barrier, соответствующего entry_declaration, обозначенного E.
Программа_ошибка генерируется, если значение Null_Task_Id передается в качестве параметра в Abort_Task, Activation_Is_Complete, Is_Terminated и Is_Callable.
Этот абзац был удален.
Ограниченные (временные) ошибки
Вызов функции Current_Task из entry_body, обработчика прерываний или завершения атрибута задачи является ограниченной ошибкой. Возникает ошибка Program_Error или возвращается определяемое реализацией значение типа Task_Id.
Ошибка выполнения
Если значение Task_Id передается в качестве параметра в любую операцию, объявленную в этом пакете (или любом определяемом языком подпакете), а соответствующий объект задачи больше не существует, выполнение программы является ошибочным.
Требования к документации
Реализация должна документировать эффект вызова Current_Task из тела входа или обработчика прерываний.
ПРИМЕЧАНИЕ 1 Этот пакет предназначен для использования при написании пользовательских пакетов планирования задач и создания задач-серверов. Current_Task может использоваться совместно с другими операциями, требующими задачу в качестве аргумента, такими как Set_Priority (см. D.5).
ПРИМЕЧАНИЕ 2 Функция Current_Task и атрибут Caller могут возвращать значение Task_Id, которое идентифицирует задачу окружения.