Справочник Ada 2012
9.5.2 Входные точки и операторы accept
Объявление_входной_точки, с соответствующими телами_входных_точек или операторами_accept, используются для определения потенциально очередизированных операций над задачами и защищенными объектами.
Синтаксис
объявление_входной_точки ::=
[индикатор_переопределения]
entry идентификатор_определения [(определение_подтипа_дискретного_типа)] профиль_параметра
[спецификация_аспекта];
[индикатор_переопределения]
entry идентификатор_определения [(определение_подтипа_дискретного_типа)] профиль_параметра
[спецификация_аспекта];
оператор_accept ::=
accept входная_прямая_ссылка [(индекс_входной_точки)] профиль_параметра [do
обработанная_последовательность_операторов
end [идентификатор_входной_точки]];
accept входная_прямая_ссылка [(индекс_входной_точки)] профиль_параметра [do
обработанная_последовательность_операторов
end [идентификатор_входной_точки]];
тело_входной_точки ::=
entry идентификатор_определения формальная_часть_тела_входной_точки барьер_входной_точки is
раздельный_блок
begin
обработанная_последовательность_операторов
end [идентификатор_входной_точки];
entry идентификатор_определения формальная_часть_тела_входной_точки барьер_входной_точки is
раздельный_блок
begin
обработанная_последовательность_операторов
end [идентификатор_входной_точки];
спецификация_индекса_входной_точки ::= for идентификатор_определения in определение_подтипа_дискретного_типа
Если идентификатор_входной_точки появляется в конце оператора accept, он должен повторять прямую_ссылку. Если идентификатор_входной_точки появляется в конце тела entry_body, он должен повторять идентификатор_определения.
Объявление объявление_входной_точки допускается только в объявлении защищенного или задач объекта.
Индикатор overriding_indicator не допускается в объявление_входной_точки, содержащей определение_подтипа_дискретного_типа.
Правила разрешения имен
В операторе accept ожидаемый профиль для прямой_ссылки соответствует объявление_входной_точки; ожидаемый тип для индекс_входной_точки соответствует подтипу, определенному в определение_подтипа_дискретного_типа соответствующего объявление_входной_точки.
Внутри обработанной последовательности операторов оператора accept, если у выбранного компонента есть префикс, указывающий на соответствующее объявление_входной_точки, то сущность, обозначенная префиксом, является оператором accept, а выбранный компонент интерпретируется как расширенное имя (см. 4.1.3); имя селектора выбранного компонента должно быть идентификатором некоторого формального параметра оператора accept.
Правила легальности
Объявление объявление_входной_точки в объявлении задачи не должно содержать спецификации для параметра доступа (см. 3.10).
Если у объявление_входной_точки есть индикатор_переопределения, то в момент объявления:
- если индикатор индикатор_переопределения равен overriding, то входная точка должна реализовывать унаследованную подпрограмму;
- если индикатор индикатор_переопределения равен not overriding, то входная точка не должна реализовывать никакую унаследованную подпрограмму.
Помимо мест, где обычно применяются Правила легальности (см. 12.3), эти правила также применяются в частях private экземпляра генерируемого блока.
Для оператора accept ближайшее содержащее тело должно быть телом задачи, а прямая_ссылка должна обозначать объявление объявление_входной_точки в соответствующем объявлении задачи; профиль оператора accept должен полностью соответствовать профилю соответствующего объявление_входной_точки. Оператор accept должен иметь скобочный индекс_входной_точки тогда и только тогда, когда соответствующее объявление_входной_точки имеет определение_подтипа_дискретного_типа.
Оператор accept не должен находиться внутри другого оператора accept, соответствующего тому же объявление_входной_точки, ни внутри асинхронного выбора, внутреннего для окружающего тела задачи.
Объявление объявление_входной_точки защищенного блока требует завершения, которое должно быть телом entry_body, и каждое тело entry_body должно быть завершением объявления объявление_входной_точки защищенного блока. Профиль тела entry_body должен полностью соответствовать профилю соответствующего объявления.
Формальная часть тела entry_body_formal_part должна иметь спецификацию индекса entry_index_specification тогда и только тогда, когда соответствующее объявление_входной_точки имеет определение_подтипа_дискретного_типа. В этом случае определения подтипов дискретного типа объявление_входной_точки и спецификация индекса entry_index_specification должны полностью соответствовать друг другу (см. 6.3.1).
Статические семантика
Режимы параметров, определенные для параметров в 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 оценивается как истинное и выбран вызывающий элемент соответствующего одиночного элемента или элемента семейства (см. 9.5.3). Для выполнения entry_body, declarative_part entry_body выполняется, и handled_sequence_of_statements тела выполняется, как при выполнении subprogram_body. Значение именованного индекса элемента, если таковое имеется, определяется значением индекса элемента, указанного в имени элемента выбранного вызова элемента (или промежуточной requeue_statement — см. 9.5.4).
ПРИМЕЧАНИЯ
24 Вход задачи имеет соответствующие accept_statements (ноль или более), в то время как у защищенного входа есть соответствующий entry_body (точно один).
25 Следствием правила, касающегося разрешенных положений accept_statements, является то, что задача может выполнять accept_statements только для своих собственных входов.
26 Оператор возврата (см. 6.5) или оператор requeue_statement (см. 9.5.4) могут быть использованы для завершения выполнения accept_statement или entry_body.
27 Условие condition в entry_barrier может ссылаться на всё видимое, за исключением формальных параметров элемента. Это включает индекс элемента (если имеется), компоненты (включая дискриминанты) защищённого объекта, атрибут Count ввода этого защищённого объекта и данные, глобальные для защищённой единицы.
Ограничение на ссылки на формальные параметры внутри entry_barrier гарантирует, что все вызовы одного и того же элемента видят одно и то же значение барьера. Если необходимо посмотреть на параметры вызова элемента, прежде чем решить, обрабатывать его или нет, entry_barrier может быть «when True», а вызывающий элемент может быть помещен в очередь (на некотором собственном входе), когда его параметры указывают, что он не может быть обработан немедленно.
Примеры
Примеры объявлений элементов:
entry Read(V : out Item);
entry Seize;
entry Request(Level)(D : Item); -- семейство входов
entry Seize;
entry Request(Level)(D : Item); -- семейство входов
Примеры операторов accept:
accept Shut_Down;
accept Read(V : out Item) do
V := Local_Item;
end Read;
V := Local_Item;
end Read;
accept Request(Low)(D : Item) do
...
end Request;
...
end Request;