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

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
type Attribute_Handle is access all Attribute;
function Value(T : Task_Id := Current_Task)
return Attribute;
function Reference(T : Task_Id := Current_Task)
return Attribute_Handle;
procedure Set_Value(Val : in Attribute;
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, соответствующий атрибут каждой задачи завершается, если он не был завершён ранее.

Ограниченные (временно́й) ошибки

Если пакет Ada.Task_Attributes инстанцируется с управляемым типом, и управляемый тип имеет определяемые пользователем операции Adjust или Finalize, которые в свою очередь обращаются к атрибутам задач с помощью любой из вышеперечисленных операций, то вызов Set_Value инстанцированного пакета представляет собой ограниченную ошибку. Вызов может выполняться как ожидалось или может привести к вечному блокированию вызывающей задачи, а впоследствии некоторых или всех задач раздела.

Ошибочное выполнение

Ошибочно разыменовывать значение доступа, возвращаемое данным вызовом Reference после последующего вызова Reinitialize для того же атрибута задачи или после завершения связанной задачи.
Если значение Task_Id передаётся в качестве параметра любой из операций, объявленных в этом пакете, и соответствующий объект задачи больше не существует, выполнение программы является ошибочным.
Доступ к атрибуту задачи через значение типа Attribute_Handle является ошибочным, если он выполняется одновременно с другим таким доступом или вызовом любой из операций, объявленных в пакете Task_Attributes. Доступ к атрибуту задачи является ошибочным, если он выполняется одновременно с завершением атрибута задачи или после него.

Требования к реализации

Для данного атрибута данной задачи реализация должна выполнять объявленные в этом пакете операции атомарно по отношению к любым из этих операций того же атрибута той же задачи. Разрешение любого механизма блокировки, необходимого для достижения такой атомарности, определяется реализацией.
После завершения атрибутов задач реализация должна вернуть любое хранилище, связанное с атрибутами.

Требования к документации

Реализация должна задокументировать предел количества атрибутов на задачу, если таковой имеется, и предел общего объёма хранилища для значений атрибутов на задачу, если такой предел существует.
Кроме того, если эти пределы могут быть настроены, реализация должна задокументировать, как их настроить.

Метрики

Реализация должна задокументировать следующие метрики: Задача, вызывающая следующие подпрограммы, должна выполняться с достаточно высоким приоритетом, чтобы не быть прервана в течение периода измерения. Этот период начинается непосредственно перед вызовом и заканчивается непосредственно после завершения вызова. Если атрибуты задачи T используются в тестах измерения, никакая другая задача не должна обращаться к атрибутам этой задачи в течение периода измерения. Для всех описанных здесь измерений тип Attribute должен быть скалярным типом, размер которого равен размеру предопределённого типа Integer. Для каждого измерения должны быть задокументированы два случая: один, где доступные атрибуты принадлежат вызывающей задаче (то есть используется значение по умолчанию для параметра 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 следует использовать с осторожностью; его всегда безопасно использовать в теле задачи, атрибут которой обращается. Однако, когда результат используется другой задачей, программист должен убедиться, что задача, атрибут которой обращается, ещё не завершена. Невыполнение этого требования может сделать выполнение программы ошибочным.
Этот абзац был удалён.


Spec-Zone.ru

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