Справочник по Ada (Ada 2022)
D.5.2 Динамические приоритеты для защищенных объектов
Этот подраздел определяет, как можно изменить или запросить приоритет защищенного объекта во время выполнения.
Статическая семантика
Для префикса P, обозначающего защищенный объект, определены следующие атрибуты:
P'Priority
Обозначает неалиасованный компонент защищенного объекта P. Этот компонент имеет тип System.Any_Priority, и его значение — приоритет P. P'Priority обозначает переменную тогда и только тогда, когда P обозначает переменную. Ссылка на этот атрибут должна появляться только в теле P.
P'Relative_Deadline
Обозначает неалиасованный компонент защищенного объекта P. Этот компонент имеет тип Ada.Real_Time.Time_Span, и его значение — относительный срок выполнения P. P'Relative_Deadline обозначает переменную тогда и только тогда, когда P обозначает переменную. Ссылка на этот атрибут должна появляться только в теле P.
Начальное значение атрибута Priority определяется начальным значением приоритета защищенного объекта (см. D.3), и может быть изменено присваиванием. Начальное значение атрибута Relative_Deadline определяется начальным значением относительного срока выполнения защищенного объекта (см. D.3), и может быть изменено присваиванием.
Динамическая семантика
Если используется политика блокировки Ceiling_Locking (см. D.3), то потолочный приоритет защищенного объекта P устанавливается в значение P'Priority в конце каждого защищенного действия объекта P.
Если используется политика блокировки Ceiling_Locking, то для защищенного объекта P, для которого указан аспект Attach_Handler или Interrupt_Handler для одного из его процедур, проверяется, что значение, присваиваемое P'Priority, находится в диапазоне System.Interrupt_Priority. Если проверка не пройдена, возникает ошибка Program_Error.
Метрики
Реализация должна документировать следующие метрики:
- Разница во времени выполнения вызовов следующих процедур в защищенном объекте P:
protected P is
procedure Do_Not_Set_Ceiling (Pr : System.Any_Priority);
procedure Set_Ceiling (Pr : System.Any_Priority);
end P;
procedure Do_Not_Set_Ceiling (Pr : System.Any_Priority);
procedure Set_Ceiling (Pr : System.Any_Priority);
end P;
protected body P is
procedure Do_Not_Set_Ceiling (Pr : System.Any_Priority) is
begin
null;
end;
procedure Set_Ceiling (Pr : System.Any_Priority) is
begin
P'Priority := Pr;
end;
end P;
procedure Do_Not_Set_Ceiling (Pr : System.Any_Priority) is
begin
null;
end;
procedure Set_Ceiling (Pr : System.Any_Priority) is
begin
P'Priority := Pr;
end;
end P;
ПРИМЕЧАНИЕ Поскольку P'Priority — обычная переменная, значение после присваивания атрибуту немедленно отражает новое значение, даже если его влияние на потолочный приоритет P откладывается до завершения защищенного действия, в котором оно выполняется.