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

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

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

Синтаксис

entry_declaration ::=
entry defining_identifier [(discrete_subtype_definition)] parameter_profile;
accept_statement ::=
accept entry_direct_name [(entry_index)] parameter_profile [do
handled_sequence_of_statements
end [entry_identifier]];
entry_index ::= expression
entry_body ::=
entry defining_identifier entry_body_formal_part entry_barrier is
declarative_part
begin
handled_sequence_of_statements
end [entry_identifier];
entry_body_formal_part ::= [(entry_index_specification)] parameter_profile
entry_barrier ::= when condition
entry_index_specification ::= for defining_identifier in discrete_subtype_definition
Если entry_identifier появляется в конце accept_statement, то он должен повторять entry_direct_name. Если entry_identifier появляется в конце entry_body, он должен повторять defining_identifier.
Оператор entry_declaration допускается только в объявлении задачи или защищённого объекта.

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

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

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

entry_declaration в объявлении задачи не должен содержать спецификацию для параметра доступа (см. 3.10).
Для accept_statement самый внутренний включающий блок должен быть task_body, а entry_direct_name должен обозначать entry_declaration в соответствующем объявлении задачи; профиль accept_statement должен полностью соответствовать entry_declaration.
accept_statement должен иметь скобочный entry_index тогда и только тогда, когда соответствующий entry_declaration имеет discrete_subtype_definition.
accept_statement не должен находиться внутри другого accept_statement, который соответствует тому же entry_declaration, ни внутри asynchronous_select внутри включающего task_body.
entry_declaration защищённого блока требует завершения, которое должно быть entry_body, и каждый entry_body должен быть завершением entry_declaration защищённого блока. Профиль entry_body должен полностью соответствовать соответствующему объявлению.
entry_body_formal_part должен иметь entry_index_specification тогда и только тогда, когда соответствующий entry_declaration имеет discrete_subtype_definition. В этом случае discrete_subtype_definitionы entry_declaration и entry_index_specification должны полностью соответствовать друг другу (см. 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.
END_OF_DOCUMENT_MARKER
Вышеупомянутое взаимодействие между вызывающей задачей и принимающей задачей называется соединением. После соединения обе задачи продолжают свою работу независимо.
Блок entry_body выполняется, когда condition entry_barrier оценивается как True и был выбран вызывающий объект соответствующего единственного входа или входа соответствующей семейства входов (см. 9.5.3). Для выполнения entry_body выполняется declarative_part entry_body, и выполняется handled_sequence_of_statements тела, как при выполнении subprogram_body. Значение именованного индекса входа, если таковой имеется, определяется значением индекса входа, указанного в имени входа entry_name выбранного вызова входа (или промежуточного requeue_statement — см. 9.5.4).
ПРИМЕЧАНИЯ
22 Вход задачи имеет соответствующие accept_statements (ноль или более), в то время как защищённый вход имеет соответствующий entry_body (точно один).
23 Следствием правила, касающегося допустимых размещений accept_statementов, является то, что задача может выполнять accept_statementы только для собственных входов.
24 return_statement (см. 6.5) или requeue_statement (см. 9.5.4) могут быть использованы для завершения выполнения accept_statement или entry_body.
25 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