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

D.14.2 Бюджеты времени выполнения группы задач

Данный пункт описывает пакет, определённый языком, для назначения бюджетов времени выполнения группам задач.

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

Существует следующий пакет библиотеки, определенный языком:
with System;
package Ada.Execution_Time.Group_Budgets is
type Group_Budget is tagged limited private;
type Group_Budget_Handler is access
protected procedure (GB : in out Group_Budget);
type Task_Array is array (Positive range <>) of
Ada.Task_Identification.Task_Id;
Min_Handler_Ceiling : constant System.Any_Priority :=
определяется реализацией;
procedure Add_Task (GB : in out Group_Budget;
T : in Ada.Task_Identification.Task_Id);
procedure Remove_Task (GB: in out Group_Budget;
T : in Ada.Task_Identification.Task_Id);
function Is_Member (GB : Group_Budget;
T : Ada.Task_Identification.Task_Id) return Boolean;
function Is_A_Group_Member
(T : Ada.Task_Identification.Task_Id) return Boolean;
function Members (GB : Group_Budget) return Task_Array;
procedure Replenish (GB : in out Group_Budget; To : in Time_Span);
procedure Add (GB : in out Group_Budget; Interval : in Time_Span);
function Budget_Has_Expired (GB : Group_Budget) return Boolean;
function Budget_Remaining (GB : Group_Budget) return Time_Span;
procedure Set_Handler (GB : in out Group_Budget;
Handler : in Group_Budget_Handler);
function Current_Handler (GB : Group_Budget)
return Group_Budget_Handler;
procedure Cancel_Handler (GB : in out Group_Budget;
Cancelled : out Boolean);
Group_Budget_Error : exception;
private
-- не определено языком
end Ada.Execution_Time.Group_Budgets;
Тип Group_Budget представляет собой бюджет времени выполнения, используемый группой задач. Тип Group_Budget требует финализации (см. 7.6). Задача может принадлежать только одной группе. В группу могут добавляться задачи любой приоритетности.
Объект типа Group_Budget имеет связанное неотрицательное значение типа Time_Span, известное как его бюджет, который изначально равен Time_Span_Zero. Тип Group_Budget_Handler идентифицирует защищённую процедуру, которая должна быть выполнена реализацией, когда бюджет исчерпан, то есть достиг нуля. Такая защищённая процедура называется обработчиком.
Объект типа Group_Budget также включает обработчик, который является значением типа Group_Budget_Handler. Обработчик объекта считается установленным, если он не равен null, и сброшенным в противном случае. Обработчик всех объектов Group_Budget изначально сброшен.

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

Процедура Add_Task добавляет задачу, идентифицированную T, в группу GB; если эта задача уже является членом другой группы, то возникает Group_Budget_Error.
Процедура Remove_Task удаляет задачу, идентифицированную T, из группы GB; если эта задача не является членом группы GB, возникает Group_Budget_Error. После успешного выполнения этой процедуры задача больше не является членом любой группы.
Функция Is_Member возвращает True, если задача, идентифицированная T, является членом группы GB; в противном случае она возвращает False.
Функция Is_A_Group_Member возвращает True, если задача, идентифицированная T, является членом какой-либо группы; в противном случае она возвращает False.
Функция Members возвращает массив значений типа Task_Identification.Task_Id, идентифицирующих членов группы GB. Порядок компонентов массива не определён.
Процедура Replenish загружает бюджет группы GB значением To как значение Time_Span. Исключение Group_Budget_Error возникает, если значение Time_Span To неположительно. Любое выполнение любого члена группы задач приводит к уменьшению бюджета, пока он не станет исчерпанным. Когда бюджет исчерпан (достигает Time_Span_Zero), связанный обработчик выполняется, если обработчик бюджета группы GB установлен. Тем не менее, задачи продолжают выполняться.
Процедура Add изменяет бюджет группы GB. Положительное значение Interval увеличивает бюджет. Отрицательное значение Interval уменьшает бюджет, но никогда не ниже Time_Span_Zero. Нулевое значение Interval не оказывает никакого влияния. Вызов процедуры Add, приводящий к тому, что значение бюджета становится равным Time_Span_Zero, вызывает выполнение связанного обработчика, если обработчик бюджета группы GB установлен.
Функция Budget_Has_Expired возвращает True, если бюджет группы GB исчерпан (равен Time_Span_Zero); в противном случае возвращает False.
Функция Budget_Remaining возвращает оставшийся бюджет группы GB. Если бюджет исчерпан, она возвращает Time_Span_Zero. Это минимальное значение для бюджета.
Процедура Set_Handler связывает обработчик Handler с Group_Budget GB; если Handler равен null, обработчик Group_Budget сбрасывается, в противном случае он устанавливается.
Вызов Set_Handler для Group_Budget, у которого уже установлен обработчик, заменяет обработчик; если Handler не равен null, обработчик Group_Budget остается установленным.
Функция Current_Handler возвращает обработчик, связанный с бюджетом группы GB, если обработчик для этой группы установлен; в противном случае она возвращает null.
Процедура Cancel_Handler сбрасывает обработчик для бюджета группы, если он установлен. Cancelled присваивается значение True, если обработчик для бюджета группы был установлен до его сброса; в противном случае присваивается False.
Константа Min_Handler_Ceiling — это минимальный приоритет потолка, необходимый для защищённого объекта с обработчиком, чтобы гарантировать отсутствие нарушения потолка при вызове этого обработчика.
Точность учёта времени выполнения задачи для Group_Budget такая же, как определена для таймеров времени выполнения из родительского пакета.
В рамках финализации объекта типа Group_Budget все задачи-члены удаляются из группы, идентифицированной этим объектом.
Если задача является членом Group_Budget при её завершении, то в рамках финализации задачи она удаляется из группы.
Для всех операций, определённых в данном пакете, Tasking_Error возникает, если задача, идентифицированная T, завершилась, а Program_Error возникает, если значение T равно Task_Identification.Null_Task_Id.
Исключение, распространяемое из обработчика, вызванного при исчерпании бюджета группы задач, не оказывает никакого влияния.

Ошибка выполнения

При вызове любого из подпрограмм, определённых в этом пакете, если задача, идентифицированная T, больше не существует, выполнение программы является ошибочным.

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

Для данного объекта Group_Budget реализация должна выполнять объявленные в этом пакете операции атомарно относительно любых операций над этим же объектом Group_Budget. Замена обработчика вызовом Set_Handler должна выполняться атомарно относительно выполнения обработчика.
ПРИМЕЧАНИЯ
43 Сброс или установка обработчика бюджета группы не изменяет текущего значения бюджета. Исчерпание или загрузка бюджета не изменяет, установлен ли обработчик бюджета группы или нет.
44 Обработчик Group_Budget_Handler может быть связан с несколькими объектами Group_Budget.


Spec-Zone.ru

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