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

9.5.2 Заявления entry и accept

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

Синтаксис

entry_declaration ::=
[индикатор_переопределения]
entry идентификатор_определения [(определение_подтипа_дискретных_значений)] профиль_параметров;
accept_statement ::=
accept entry_прямое_имя [(индекс_entry)] профиль_параметров [do
обработанная_последовательность_операторов
end [entry_идентификатор]];
entry_index ::= выражение
entry_body ::=
entry идентификатор_определения формальная_часть_entry_body барьер_entry is
часть_объявления
begin
обработанная_последовательность_операторов
end [entry_идентификатор];
entry_body_formal_part ::= [(спецификация_индекса_entry)] профиль_параметров
entry_barrier ::= when условие
entry_index_specification ::= for идентификатор_определения in определение_подтипа_дискретных_значений
Если entry_идентификатор появляется в конце заявления_accept, он должен повторять entry_прямое_имя. Если entry_идентификатор появляется в конце entry_body, он должен повторять идентификатор_определения.
Заявление entry_declaration разрешено только в объявлении protected или task.
Индикатор overriding_indicator не допускается в entry_declaration , включающем определение_подтипа_дискретных_значений.

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

В заявлении_accept ожидаемый профиль для entry_прямого_имени — это профиль entry_declaration; ожидаемый тип для индекса_entry — это тип, определенный подтипом discrete_subtype_definition соответствующего entry_declaration.
Внутри обработанной_последовательности_операторов заявления_accept, если у выбранного_компонента есть префикс, указывающий на соответствующее entry_declaration, то сущность, обозначенная префиксом, является заявлением_accept, и выбранный_компонент интерпретируется как расширенное имя (см. 4.1.3); имя selector_name выбранного_компонента должно быть идентификатором для некоторого формального параметра заявления_accept.

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

Заявление entry_declaration в объявлении задачи не должно содержать спецификацию для параметра доступа (см. 3.10).
Если entry_declaration имеет индикатор_переопределения, то в момент объявления:
  • если индикатор_переопределения — переопределяющий, то entry реализует унаследованную подпрограмму;
  • если индикатор_переопределения — не_переопределяющий, то entry не реализует ни одну унаследованную подпрограмму.
Помимо мест, где обычно применяются правила легитимности (см. 12.3), эти правила также применяются в частях private экземпляра обобщенного блока.
Для заявления_accept ближайшее включающее тело должно быть телом_задачи, и entry_прямое_имя должно обозначать entry_declaration в соответствующем объявлении задачи; профиль заявления_accept должен полностью соответствовать профилю соответствующего entry_declaration. Заявление accept_statement должно иметь скобочный индекс_entry, если и только если соответствующий entry_declaration имеет определение_подтипа_дискретных_значений.
Заявление accept_statement не должно находиться внутри другого accept_statement, соответствующего тому же entry_declaration, ни внутри асинхронного_выбора внутри включающего тела_задачи.
Заявление entry_declaration защищенного блока требует завершения, которое должно быть entry_body, и каждое entry_body должно быть завершением entry_declaration защищенного блока. Профиль entry_body должен полностью соответствовать профилю соответствующего объявления.
Формальная часть entry_body_formal_part должна иметь спецификацию_индекса_entry, если и только если соответствующий entry_declaration имеет определение_подтипа_дискретных_значений. В этом случае, определения подтипов entry_declaration и спецификации_индекса_entry должны полностью соответствовать друг другу (см. 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 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. Значение именованного индекса записи, если таковое имеется, определяется значением индекса записи, указанного в имени записи выбранного вызова записи (или промежуточного requeue_statement — см. 9.5.4).
ПРИМЕЧАНИЯ
23 Запись задачи имеет соответствующие accept_statements (ноль или более), в то время как защищённая запись имеет соответствующий entry_body (ровно один).
24 Следствием правила, касающегося разрешенных размещений accept_statements, является то, что задача может выполнять accept_statements только для своих собственных записей.
25 Для завершения выполнения accept_statement или entry_body может использоваться оператор return (см. 6.5) или оператор requeue_statement (см. 9.5.4).
26 Условие 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