Справочник Ada 95
D.3 Запрет доступа по приоритету
Этот пункт описывает взаимодействия между планированием задач по приоритету и потолочными объектами. Это взаимодействие основано на понятии приоритета потолка защищенного объекта.
Синтаксис
Форма директивы pragma Locking_Policy такова:
pragma Locking_Policy(policy_идентификатор);
Правила допустимости
policy_идентификатор должен быть либо Ceiling_Locking, либо определённым реализацией идентификатором.
Правила после компиляции
Директива Locking_Policy является конфигурационной директивой.
Динамические семантика
Политика блокировки определяет детали блокировки защищенных объектов. Эти правила определяют, имеют ли защищенные объекты приоритеты, и отношения между этими приоритетами и приоритетами задач. Кроме того, политика определяет состояние задачи при выполнении защищенного действия и как на него влияет блокировка. Политика блокировки задаётся директивой Locking_Policy. Для определенных реализацией политик блокировки, влияние директивы Priority или Interrupt_Priority на защищенный объект определяется реализацией. Если ни одна директива Locking_Policy не применяется к какой-либо из единиц программы, составляющих партицию, политика блокировки для этой партиции, а также влияние задания директивы Priority или Interrupt_Priority для защищённого объекта определяется реализацией.
Существует одна предопределённая политика блокировки, Ceiling_Locking; эта политика определяется следующим образом:
- Каждый защищённый объект имеет приоритет потолка, который определяется директивой Priority или Interrupt_Priority, как определено в D.1. Приоритет потолка защищённого объекта (или, коротко, потолок) является верхней границей активного приоритета задачи при вызове защищенных операций этого защищенного объекта.
- Выражение директивы Priority или Interrupt_Priority вычисляется во время создания соответствующего защищенного объекта и преобразуется в подтип System.Any_Priority или System.Interrupt_Priority соответственно. Значение выражения — это приоритет потолка соответствующего защищенного объекта.
- Если директива Interrupt_Handler или Attach_Handler (см. C.3.1) появляется в protected_definition без директивы Interrupt_Priority, приоритет потолка защищенных объектов данного типа определяется реализацией, но в диапазоне подтипа System.Interrupt_Priority.
- Если ни одна директива Priority, Interrupt_Priority, Interrupt_Handler или Attach_Handler не указана в protected_definition, то приоритет потолка соответствующего защищённого объекта — System.Priority'Last.
- Пока задача выполняет защищённое действие, она унаследует приоритет потолка соответствующего защищённого объекта.
- При вызове задачи защищённой операции выполняется проверка, что её активный приоритет не выше потолка соответствующего защищенного объекта; если проверка завершается неудачно, генерируется Program_Error.
Разрешения реализации
Реализация имеет право округлять все потолки в определённом поддиапазоне System.Priority или System.Interrupt_Priority до верхней границы этого поддиапазона, единообразно.
Реализации разрешено определять другие политики блокировки, но нет необходимости поддерживать более одной такой политики на партицию.
Поскольку реализациям разрешено вводить ограничения на код, выполняемый на уровне активного приоритета прерывания (см. C.3.1 и D.2.1), реализация может реализовать язык-функцию в терминах защищенного объекта с реализацией-определённым потолком, но потолок должен быть не меньше Priority'Last.
Рекомендации по реализации
Реализация должна использовать имена, оканчивающиеся на ``_Locking'' для политик блокировки, определённых реализацией.
ПРИМЕЧАНИЯ
16 Пока задача выполняет защищённое действие, её можно прервать только задачами, активные приоритеты которых выше приоритета потолка защищенного объекта.
17 Если у защищённого объекта есть приоритет потолка в диапазоне Interrupt_Priority, определённые прерывания блокируются во время выполнения защищенных действий этого объекта. В крайнем случае, если потолок — Interrupt_Priority'Last, все блокируемые прерывания блокируются в течение этого времени.
18 Приоритет потолка защищенного объекта должен быть в диапазоне Interrupt_Priority, если один из его процедур должен использоваться в качестве обработчика прерываний (см. C.3).
19 При определении потолка защищённого объекта следует выбрать значение, которое по крайней мере, равно наивысшему активному приоритету, на котором могут выполняться задачи при вызове защищённых операций этого объекта. При определении этого значения следует учитывать следующие факторы, которые могут влиять на активный приоритет: эффект Set_Priority, вложенные защищённые операции, вызовы входов, активация задач и другие факторы, определяемые реализацией.
20 Присоединение защищённой процедуры, чей потолок ниже приоритета аппаратного прерывания к прерыванию приводит к ошибочному выполнению программы (см. C.3.1).
21 В реализации на единственном процессоре правила приоритета потолка гарантируют, что нет возможности тупика, связанного только с защищёнными подпрограммами (за исключением случая, когда защищенная операция вызывает другую защищенную операцию того же защищённого объекта).