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

9.5.1 Защищённые подпрограммы и защищённые действия

Защищённая подпрограмма — это подпрограмма, объявленная непосредственно внутри protected_definition. Защищённые процедуры обеспечивают эксклюзивный доступ для чтения и записи к данным защищённого объекта; защищённые функции обеспечивают одновременный доступ для чтения только к данным.

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

В теле защищённой функции (или функции, объявленной непосредственно внутри protected_body) текущий экземпляр окружающего защищённого блока определяется как константа (то есть, его подкомпоненты могут быть считаны, но не обновлены). В теле защищённой процедуры (или процедуры, объявленной непосредственно внутри protected_body) и внутри entry_body текущий экземпляр определяется как переменная (обновление разрешено).

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

Для выполнения вызова защищённой подпрограммы, оценка имени или префикса и ассоциации параметров, а также любое присваивание параметров in out или out, происходит как при вызове обычной подпрограммы (см. 6.4). Если вызов является внутренним (см. 9.5), тело подпрограммы выполняется как при вызове обычной подпрограммы. Если вызов является внешним, то тело подпрограммы выполняется как часть нового защищённого действия над целевым защищённым объектом; защищённое действие завершается после выполнения тела подпрограммы. Защищённое действие также может быть запущено вызовом входа (см. 9.5.3).
Новое защищённое действие не запускается на защищённом объекте, пока другое защищённое действие над тем же защищённым объектом не завершено, если оба действия не являются результатом вызова защищённой функции. Это правило выражается через ресурс выполнения, связанный с защищённым объектом:
  • Начало защищённого действия на защищённом объекте соответствует получению ресурса выполнения, связанного с защищённым объектом, либо для одновременного доступа для чтения, если защищённое действие предназначено для вызова защищённой функции, либо для эксклюзивного доступа для чтения и записи в противном случае;
  • Завершение защищённого действия соответствует освобождению связанного ресурса выполнения.
После выполнения операции над защищённым объектом, отличной от вызова защищённой функции, но до завершения связанного защищённого действия, очереди входов (если таковые имеются) защищённого объекта обслуживаются (см. 9.5.3).

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

Во время защищённого действия вызов операции, которая потенциально блокирующая, является ошибкой. Следующие операции определяются как потенциально блокирующие:
  • a select_statement;
  • an accept_statement;
  • an entry_call_statement;
  • a delay_statement;
  • an abort_statement;
  • создание или активация задачи;
  • внешний вызов защищённой подпрограммы (или внешнее переочередивание) с тем же целевым объектом, что и защищённое действие;
  • вызов подпрограммы, тело которой содержит потенциально блокирующую операцию.
Если ошибка обнаружена, генерируется исключение Program_Error. Если не обнаружена, ограниченная ошибка может привести к тупику или (вложенному) защищённому действию над тем же целевым объектом.
Некоторые определённые языком подпрограммы потенциально блокирующие. В частности, подпрограммы языковых пакетов ввода-вывода, которые обрабатывают файлы (явным или неявным образом), потенциально блокирующие. Другие потенциально блокирующие подпрограммы идентифицируются там, где они определены. Если не указано, что подпрограмма потенциально блокирующая, она неблокирующая.
ПРИМЕЧАНИЯ
18 Если две задачи пытаются запустить защищённое действие на защищённом объекте, и максимум одна вызывает защищённую функцию, то только одна задача может продолжить. Хотя другая задача не может продолжить, она не считается заблокированной и может потреблять ресурсы обработки, пока ждёт своей очереди. Нет определённого языком порядка или очереди задач, конкурирующих для запуска защищённого действия — на многопроцессорных системах такие задачи могут использовать активное ожидание; для однопроцессорных систем см. D.3, «Замки с потолком приоритета».
19 Тело защищённого блока может содержать объявления и тела локальных подпрограмм. Они невидимы вне защищённого блока.
20 Тело защищённой функции может содержать внутренние вызовы других защищённых функций, но не защищённых процедур, так как текущий экземпляр является константой. С другой стороны, тело защищённой процедуры может содержать внутренние вызовы как защищённых функций, так и процедур.
21 Изнутри защищённого действия внутренний вызов защищённой подпрограммы или внешний вызов защищённой подпрограммы с другим целевым объектом не считается потенциально блокирующей операцией.
22 Предикат pragma Detect_Blocking может быть использован для обеспечения того, что все исполнения потенциально блокирующих операций во время защищённого действия вызывают Program_Error. См. H.5.

Примеры

Примеры вызовов защищённых подпрограмм (см. 9.4):
Shared_Array.Set_Component(N, E);
E := Shared_Array.Component(M);
Control.Release;


Spec-Zone.ru

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