Spec-Zone.ru › Ada 2012
Руководство по Ada 2012

D.3 Блокировка по приоритету потолка

Этот подраздел описывает взаимодействие между планированием задач по приоритету и потолками защищенных объектов. Это взаимодействие основано на понятии приоритета потолка защищенного объекта.

Синтаксис

Форма pragma Locking_Policy следующая:
pragma Locking_Policy(policy_идентификатор);

Правила легальности

policy_идентификатор должен быть Ceiling_Locking или определенным реализацией идентификатором.

Правила после компиляции

Pragma Locking_Policy является конфигурационным pragma.

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

Политика блокировки определяет детали блокировки защищенных объектов. Все защищенные объекты имеют приоритет. Политика блокировки определяет значение приоритета защищенного объекта и взаимоотношения между этими приоритетами и приоритетами задач. Кроме того, политика определяет состояние задачи при выполнении защищенного действия и то, как на ее активный приоритет влияет блокировка. Политика блокировки задается с помощью pragma Locking_Policy. Для определенных реализацией политик блокировки значение приоритета защищенного объекта определяется реализацией. Если для ни одной из программных единиц, составляющих раздел, не применяется pragma Locking_Policy, политика блокировки для этого раздела, а также значение приоритета защищенного объекта, определяются реализацией.
Выражение, указанное для аспекта Priority или Interrupt_Priority (см. D.1), вычисляется при создании соответствующего защищенного объекта и преобразуется в подтип System.Any_Priority или System.Interrupt_Priority соответственно. Значение выражения является начальным приоритетом соответствующего защищенного объекта. Если для защищенного объекта не указан аспект Priority или Interrupt_Priority, начальный приоритет задается политикой блокировки.
Существует одна предопределенная политика блокировки, Ceiling_Locking; эта политика определяется следующим образом:
  • Каждый защищенный объект имеет приоритет потолка, который определяется аспектом Priority или Interrupt_Priority, как определено в D.1, или путем присвоения атрибуту Priority, как описано в D.5.2. Приоритет потолка защищенного объекта (или просто потолок) представляет собой верхнюю границу активного приоритета задачи при вызове защищенных операций этого защищенного объекта.
  • Начальный приоритет потолка защищенного объекта равен начальному приоритету для этого объекта.
  • Если для защищенной подпрограммы защищенного типа, не имеющего аспектов Priority или Interrupt_Priority, указан аспект Interrupt_Handler или Attach_Handler (см. C.3.1), начальный приоритет защищенных объектов этого типа определяется реализацией, но находится в диапазоне подтипа System.Interrupt_Priority.
  • Если для защищенного типа не указаны ни аспект Priority, ни Interrupt_Priority, и ни одна защищенная подпрограмма типа не имеет указанного аспекта Interrupt_Handler или Attach_Handler, то начальный приоритет соответствующего защищенного объекта равен System.Priority'Last.
  • Пока задача выполняет защищенное действие, она наследует приоритет потолка соответствующего защищенного объекта.
  • При вызове защищенной операции проверяется, что ее активный приоритет не выше потолка соответствующего защищенного объекта; если эта проверка не пройдена, генерируется Program_Error.

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

После любого изменения приоритета активный приоритет любой задачи с ожидающим вызовом на входе защищенного объекта должен быть ниже приоритета потолка защищенного объекта. В этом случае выполняется одно из следующего:
  • в любое время до выполнения тела входа Program_Error генерируется в вызывающей задаче;
  • когда вход открыт, тело входа выполняется с приоритетом потолка защищенного объекта;
  • когда вход открыт, тело входа выполняется с приоритетом потолка защищенного объекта, а затем в вызывающей задаче генерируется Program_Error; или
  • когда вход открыт, тело входа выполняется с приоритетом потолка защищенного объекта, который действовал при очереди вызова входа.

Разрешения реализации

Реализация имеет право округлять все потолки в определенном поддиапазоне System.Priority или System.Interrupt_Priority до верхней границы этого поддиапазона равномерно.
Реализации разрешается определять другие политики блокировки, но не требуется поддерживать более одной политики блокировки на раздел.
Поскольку реализациям разрешается накладывать ограничения на код, выполняющийся с активным приоритетом прерывания (см. C.3.1 и D.2.1), реализация может реализовать языковую функцию в терминах защищенного объекта с реализацией определенного потолка, но потолок должен быть не меньше Priority'Last.

Рекомендации по реализации

Реализация должна использовать имена, оканчивающиеся на «_Locking», для определенных реализацией политик блокировки.
ПРИМЕЧАНИЯ
20 Пока задача выполняется в защищенном действии, ее можно прервать только задачами, активные приоритеты которых выше приоритета потолка защищенного объекта.
21 Если защищенный объект имеет приоритет потолка в диапазоне Interrupt_Priority, определенные прерывания блокируются во время выполнения защищенных действий этого объекта. В крайнем случае, если потолок равен Interrupt_Priority'Last, все блокируемые прерывания блокируются в это время.
22 Приоритет потолка защищенного объекта должен находиться в диапазоне Interrupt_Priority, если одна из его процедур должна использоваться в качестве обработчика прерываний (см. C.3).
23 При указании потолка защищенного объекта следует выбирать значение, которое не ниже самого высокого активного приоритета, с которым могут выполняться задачи при вызове защищенных операций этого объекта. При определении этого значения следует учитывать следующие факторы, которые могут повлиять на активный приоритет: эффект Set_Priority, вложенные защищенные операции, вызовы входов, активация задач и другие факторы, определяемые реализацией.
24 Присоединение защищенной процедуры, чей потолок ниже приоритета аппаратного прерывания к прерыванию приводит к ошибке выполнения программы (см. C.3.1).
25 В реализации на одном процессоре правила приоритета потолка гарантируют отсутствие возможности тупика, связанного только с защищенными подпрограммами (исключая случай, когда защищенная операция вызывает другую защищенную операцию на том же защищенном объекте).


Spec-Zone.ru

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