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

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 следует документировать.
Завершение атрибутов задачи и освобождение связанного хранилища должны выполняться как можно скорее после завершения задачи.
ПРИМЕЧАНИЯ
13 Атрибут всегда существует (после инстанцирования) и имеет начальное значение. Он не обязательно занимает память до первой операции, которая может изменить значение атрибута. То же самое относится и после Reinitialize.
14 Результат функции Reference следует использовать с осторожностью; его всегда безопасно использовать в теле задачи, чье атрибут обращается. Однако при использовании результата другой задачей программист должен убедиться, что задача, чье атрибут обращается, еще не завершена. Несоблюдение этого может привести к ошибочному выполнению программы.


Spec-Zone.ru

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