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

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

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

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

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

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

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

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

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

Примеры

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


Spec-Zone.ru

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