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

9.5.2 Входы и операторы accept

Декларации входов, с соответствующими блоками входов или операторами accept, используются для определения потенциально очереди операций на задачах и защищенных объектах.

Синтаксис

Декларация входа ::=
[Индикатор переопределения]
вход Идентификатор определения [(Определение дискретного подтипа)] Профиль параметров
[Спецификация аспекта];
Оператор accept ::=
accept Имя входаПрямое имя [(Индекс входа)] Профиль параметров [do
Обработанная последовательность операторов
end [Идентификатор входаИдентификатор]];
Индекс входа ::= Выражение
Блок входа ::=
вход Идентификатор определения Формальная часть блока входа
[Спецификация аспекта]
Барьер входа is
Объявляющая часть
begin
Обработанная последовательность операторов
end [Идентификатор входаИдентификатор];
Формальная часть блока входа ::= [(Спецификация индекса входа)] Профиль параметров
Барьер входа ::= когда Условие
Спецификация индекса входа ::=
for Идентификатор определения in Определение дискретного подтипа [Спецификация аспекта]
Если Идентификатор входа появляется в конце оператора accept, он повторяет прямое имя входа. Если Идентификатор входа появляется в конце блока входа, он повторяет Идентификатор определения.
Декларация входа разрешена только в декларации защищенного или заданного объекта.
Индикатор переопределения не разрешен в декларации входа, содержащей Определение дискретного подтипа.

Правила разрешения имен

В операторе accept ожидаемый профиль для прямого имени входа - это профиль декларации входа; ожидаемый тип для индекса входа - это тип, определенный подтипом, заданным Определением дискретного подтипа соответствующей декларации входа.
Внутри обработанной последовательности операторов оператора accept, если у выбранного компонента есть префикс, указывающий на соответствующую декларацию входа, то сущность, обозначаемая префиксом, является оператором accept, и выбранный компонент интерпретируется как расширенное имя (см. 4.1.3); имя селектора выбранного компонента должно быть идентификатором для формального параметра оператора accept.

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

Декларация входа в декларации задачи не должна содержать спецификации для параметра доступа (см. 3.10).
Если декларация входа имеет индикатор переопределения, то в момент объявления:
  • если индикатор переопределения равен переопределяет, то вход должен реализовывать унаследованную подпрограмму;
  • если индикатор переопределения равен не переопределяет, то вход не должен реализовывать никакую унаследованную подпрограмму.
В дополнение к местам, где обычно применяются Правила легальности (см. 12.3), эти правила также применяются в частях «private» экземпляра порождаемого модуля.
Для оператора accept самый внутренний включающий блок должен быть блоком задачи, а прямое имя входа должно обозначать декларацию входа в соответствующей декларации задачи; профиль оператора accept должен полностью соответствовать профилю соответствующей декларации входа. Оператор accept должен иметь скобочный индекс входа, если и только если соответствующая декларация входа имеет определение дискретного подтипа.
Оператор accept не должен находиться внутри другого оператора accept, соответствующего той же декларации входа, ни внутри асинхронного выбора, вложенного в включающий блок задачи.
Декларация входа защищенного блока требует завершения, которое должно быть блоком входа, и каждый блок входа должен быть завершением декларации входа защищенного блока. Профиль блока входа должен полностью соответствовать профилю соответствующей декларации.
Формальная часть блока входа должна иметь спецификацию индекса входа, если и только если соответствующая декларация входа имеет определение дискретного подтипа. В этом случае определения дискретных подтипов декларации входа и спецификации индекса входа должны полностью соответствовать друг другу (см. 6.3.1).
Имя, обозначающее формальный параметр entry_body, не допускается в entry_barrier entry_body.

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

Режимы параметров, определённые для параметров в parameter_profile entry_declaration, такие же, как и для subprogram_declaration, и имеют то же значение (см. 6.2).
entry_declaration с discrete_subtype_definition (см. 3.6) объявляет семейство отдельных записей с одинаковым профилем, по одной записи для каждого значения типа индекса записи, определённого discrete_subtype_definition. Имя записи семейства имеет вид indexed_component, где prefix обозначает entry_declaration семейства, а значение индекса определяет запись в семействе. Термин одиночная запись используется для обозначения любой записи, отличной от записи семейства записей.
В entry_body для семейства записей entry_index_specification объявляет именованную константу, подтип которой — тип индекса записи, определённый соответствующей entry_declaration; значение именованного индекса записи определяет, какая запись семейства была вызвана.

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

Выполнение entry_declaration для семейства записей состоит из выполнения discrete_subtype_definition, как описано в 3.8. Выполнение entry_declaration для одиночной записи не имеет эффекта.
Действия, выполняемые при вызове записи, определяются соответствующими accept_statement (если есть) для записи единицы задачи и соответствующим entry_body для записи защищённого блока.
Взаимодействие задачи, вызывающей запись, и принимающей задачи называется согласованием.
При выполнении accept_statement entry_index, если он есть, сначала оценивается и преобразуется в тип индекса записи; это значение индекса определяет, какая запись семейства должна быть принята. Далее выполнение accept_statement блокируется до тех пор, пока не будет выбран вызывающий элемент соответствующей записи (см. 9.5.3), после чего выполняется handled_sequence_of_statements accept_statement, если таковой имеется, с формальными параметрами, связанными с соответствующими фактическими параметрами выбранного вызова записи. Выполнение согласования состоит из выполнения handled_sequence_of_statements, выполнения любых проверок постсловия или инварианта типа, связанных с записью, и любых инициализаций или завершений, связанных с этими проверками, как описано в 6.1.1 и 7.3.2. После выполнения согласования accept_statement завершается и покидается. Затем две задачи продолжают работу независимо. Если исключение передаётся из handled_sequence_of_statements accept_statement, то это же исключение также поднимается при выполнении соответствующего entry_call_statement.
Этот абзац был удалён.
Блок entry_body выполняется, когда условие condition entry_barrier принимает значение True и был выбран вызывающий элемент соответствующей одиночной записи или записи соответствующего семейства записей (см. 9.5.3). Для выполнения entry_body выполняется declarative_part entry_body и выполняется handled_sequence_of_statements тела, как и при выполнении subprogram_body. Значение именованного индекса записи, если он есть, определяется значением индекса записи, указанного в имени записи name выбранного вызова записи (или промежуточного requeue_statement — см. 9.5.4).
ПРИМЕЧАНИЕ 1 Запись задачи имеет соответствующие accept_statements (ноль или более), тогда как защищённая запись имеет соответствующий entry_body (ровно один).
ПРИМЕЧАНИЕ 2 Следствием правила относительно разрешённых размещений accept_statement является то, что задача может выполнять accept_statement только для своих записей.
ПРИМЕЧАНИЕ 3 Оператор return (см. 6.5) или requeue_statement (см. 9.5.4) может использоваться для завершения выполнения accept_statement или entry_body.
ПРИМЕЧАНИЕ 4 Условие condition в entry_barrier может ссылаться на всё видимое, кроме формальных параметров записи. Это включает в себя индекс записи (если он есть), компоненты (включая дискриминанты) защищённого объекта, атрибут Count записи этого защищённого объекта и данные, глобальные для защищённого блока.
Ограничение на ссылку на формальные параметры внутри entry_barrier гарантирует, что все вызовы одной и той же записи видят одно и то же значение барьера. Если необходимо посмотреть на параметры вызова записи до принятия решения о её обработке, entry_barrier может быть «when True», и вызывающий элемент может быть помещён в очередь (на некоторой частной записи), когда его параметры указывают на то, что он не может быть обработан немедленно.

Примеры

Примеры объявлений записей:
entry Read(V : out Item);
entry Seize;
entry Request(Level)(D : Item); -- семейство записей
Примеры операторов accept:
accept Shut_Down;
accept Read(V : out Item) do
V := Local_Item;
end Read;
accept Request(Low)(D : Item) do
...
end Request;


Spec-Zone.ru

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