Справочник по Ada 95
C.7.2 Пакет Task_Attributes
Статическая семантика
Существует следующий генерический библиотечный пакет, определённый языком:
with Ada.Task_Identification; use Ada.Task_Identification;
generic
type Attribute is private;
Initial_Value : in Attribute;
package Ada.Task_Attributes is
generic
type Attribute is private;
Initial_Value : in Attribute;
package Ada.Task_Attributes is
type Attribute_Handle is access all Attribute;
function Value(T : Task_ID := Current_Task)
return Attribute;
return Attribute;
function Reference(T : Task_ID := Current_Task)
return Attribute_Handle;
return Attribute_Handle;
procedure Set_Value(Val : in Attribute;
T : in Task_ID := Current_Task);
procedure Reinitialize(T : in Task_ID := Current_Task);
T : in Task_ID := Current_Task);
procedure Reinitialize(T : in Task_ID := Current_Task);
end Ada.Task_Attributes;
Динамическая семантика
При обработке экземпляра Task_Attributes в активном разделе, для каждой задачи (в этом разделе), которая существует и ещё не завершена, неявно создаётся объект фактического типа, соответствующего формальному типу Attribute. Этот объект выступает в качестве определяемого пользователем атрибута задачи. Задача, созданная ранее в разделе и ещё не завершённая, получает этот атрибут с этого момента. Каждая задача, созданная впоследствии в этом разделе, получит этот атрибут при создании. Во всех этих случаях начальное значение данного атрибута равно Initial_Value.
Операция Value возвращает значение соответствующего атрибута T.
Операция Reference возвращает значение доступа, которое указывает на соответствующий атрибут T.
Операция Set_Value выполняет любые завершающие действия со старым значением атрибута T и присваивает этому атрибуту значение Val (см. 5.2 и 7.6).
Эффект операции Reinitialize такой же, как у Set_Value, где параметр Val заменён на Initial_Value.
Для всех операций, объявленных в этом пакете, Tasking_Error поднимается, если задача, идентифицируемая T, завершена. Program_Error поднимается, если значение T равно Null_Task_ID.
Ограниченные (временно́й) ошибки
Если пакет Ada.Task_Attributes инстанцирован с управляемым типом, и управляемый тип имеет определяемые пользователем операции Adjust или Finalize, которые, в свою очередь, обращаются к атрибутам задач с помощью любых из вышеперечисленных операций, то вызов Set_Value инстанцированного пакета представляет собой ограниченную ошибку. Вызов может выполняться как ожидалось, или может привести к вечному блокированию вызывающей задачи и, впоследствии, некоторых или всех задач раздела.
Ошибочное выполнение
Ошибка возникает при обращении к значению доступа, возвращённому данным вызовом Reference после последующего вызова Reinitialize для того же атрибута задачи или после завершения связанной задачи.
Если значение Task_ID передаётся в качестве параметра любой из операций, объявленных в этом пакете, и соответствующий объект задачи больше не существует, выполнение программы является ошибочным.
Доступ к атрибутам задач через значение типа Attribute_Handle является ошибочным, если выполняется одновременно с другими или с вызовами любой из операций, объявленных в пакете Task_Attributes.
Требования к реализации
Для данного атрибута данной задачи реализация должна выполнять объявленные в этом пакете операции атомарно по отношению к любым из этих операций того же атрибута той же задачи. Степень дробления любой необходимой блокировки для достижения такой атомарности определяется реализацией.
При завершении задачи реализация должна завершить все атрибуты задачи и освободить любое другое хранилище, связанное с атрибутами.
Требования к документации
Реализация должна задокументировать предельное количество атрибутов на задачу, если таковое имеется, и предел общего объёма памяти для значений атрибутов на задачу, если такой предел существует.
Кроме того, если эти пределы могут быть настроены, реализация должна задокументировать способ их настройки.
Метрики
Реализация должна задокументировать следующие метрики: Задача, вызывающая следующие подпрограммы, должна выполняться с достаточно высоким приоритетом, чтобы не быть прерванной в период измерения. Этот период начинается непосредственно перед вызовом и заканчивается непосредственно после завершения вызова. Если атрибуты задачи T обращаются в тестовых измерениях, никакая другая задача не должна обращаться к атрибутам этой задачи в период измерения. Для всех описанных здесь измерений тип Attribute должен быть скалярным, размер которого равен размеру предопределённого целого размера. Для каждого измерения должны быть задокументированы два случая: один, где обращение к атрибутам выполняется вызывающей задачей (то есть используется значение по умолчанию для параметра T), и другой, где T идентифицирует другую, не завершённую задачу.
Следующие вызовы (подпрограмм в пакете Task_Attributes) должны быть измерены:
- вызов Value, где возвращаемое значение равно Initial_Value;
- вызов Value, где возвращаемое значение не равно Initial_Value;
- вызов Reference, где возвращаемое значение указывает на значение, равное Initial_Value;
- вызов Reference, где возвращаемое значение указывает на значение, не равное Initial_Value;
- вызов Set_Value, где параметр Val не равен Initial_Value, а старое значение атрибута равно Initial_Value.
- вызов Set_Value, где параметр Val не равен Initial_Value, а старое значение атрибута не равно Initial_Value.
Разрешения реализации
Реализация не должна фактически создавать объект, соответствующий атрибуту задачи, до тех пор, пока его значение не будет установлено на что-то отличное от Initial_Value или пока не будет вызван Reference для атрибута задачи. Аналогично, когда значение атрибута должно быть повторно инициализировано значением Initial_Value, объект может быть завершён и его хранилище освобождено, чтобы быть воссозданным позже при необходимости. Пока объект не существует, функция Value может просто вернуть Initial_Value вместо неявного создания объекта.
Реализация имеет право устанавливать ограничения на максимальное количество атрибутов задачи, максимальный размер каждого атрибута и общий размер хранилища, выделенного для всех атрибутов задачи.
Рекомендации по реализации
Некоторые реализации ориентированы на области, в которых использование памяти во время выполнения должно быть полностью детерминированным. Для таких реализаций рекомендуется, чтобы хранилище для атрибутов задач предзаполнялось статически, а не из кучи. Это можно сделать, либо установив ограничения на количество и размер атрибутов задачи, либо используя предзаполненное хранилище для первых N объектов атрибутов, а кучу – для остальных. В последнем случае N следует задокументировать.
ПРИМЕЧАНИЯ
12 Атрибут всегда существует (после инстанцирования) и имеет начальное значение. Он не обязательно занимает память до первой операции, которая потенциально изменяет значение атрибута. То же самое верно и после Reinitialize.
13 Результат функции Reference следует использовать с осторожностью; его всегда безопасно использовать в теле задачи, атрибут которой обращается. Однако, когда результатом пользуется другая задача, программист должен убедиться, что задача, атрибут которой обращается, ещё не завершена. Невыполнение этого может сделать выполнение программы ошибочным.
14 Как указано в C.7.1, если параметр T (в вызове подпрограммы экземпляра этого пакета) идентифицирует несуществующую задачу, выполнение программы является ошибочным.