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

9.5.3 Вызовы процедур-входов

Оператор entry_call_statement (вызов процедуры-входа) может использоваться в различных контекстах. Простой вызов процедуры-входа представляет собой самостоятельное утверждение, которое представляет собой безусловный вызов процедуры-входа целевого задания или защищенного объекта. Вызовы процедур-входа также могут быть частью операторов select_statement (см. 9.7).

Синтаксис

entry_call_statement ::= procedure_name [actual_parameter_part];

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

Идентификатор procedure_name в операторе entry_call_statement должен обозначать процедуру-вход. Правила ассоциации параметров совпадают с правилами для вызовов подпрограмм (см. 6.4 и 6.4.1).

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

Идентификатор procedure_name оператора entry_call_statement указывает (явным или неявным образом) целевой объект вызова, процедуру-вход или семейство процедур-входов и, при необходимости, индекс процедуры-входа (см. 9.5).

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

В определенных условиях (подробно описанных ниже) проверяется, является ли процедура-вход задачи или защищенного объекта открытой или закрытой:
  • Процедура-вход задачи открыта, если задача заблокирована в операторе accept_statement, соответствующем процедуре-входу (см. 9.5.2), или в операторе selective_accept (см. 9.7.1) с открытым альтернативным оператором accept_alternative, соответствующим процедуре-входу; в противном случае она закрыта.
  • Процедура-вход защищенного объекта открыта, если условие condition барьера entry_barrier соответствующей процедуры-входа entry_body равно True; в противном случае она закрыта. Если вычисление condition приводит к возникновению исключения, исключение Program_Error передается всем текущим вызывающим сторонам всех процедур-входов защищенного объекта.
Для выполнения оператора entry_call_statement вычисляются идентификатор name и ассоциации параметров, как и при вызове подпрограммы (см. 6.4). Затем вызов процедуры-входа выполняется: Для вызова процедуры-входа защищенного объекта запускается новая защищенная операция объекта (см. 9.5.1). Проверяется, является ли названная процедура-вход открытой; если она открыта, вызов процедуры-входа называется немедленным выбором, и выполнение вызова происходит следующим образом:
  • Для вызова открытой процедуры-входа задачи принимающая задача становится готовой и продолжает выполнение соответствующего оператора accept_statement (см. 9.5.2).
  • Для вызова открытой процедуры-входа защищенного объекта выполняется соответствующий entry_body (см. 9.5.2) как часть защищенной операции.
Если оператор accept_statement или entry_body завершается иначе, чем путем переупорядочения (см. 9.5.4), управление возвращается вызывающей стороне (после обслуживания очередей процедур-входов — см. ниже); происходят необходимые присваивания формальных параметров фактическим параметрам, как и при вызове подпрограммы (см. 6.4.1); такие присваивания происходят за пределами любой защищенной операции.
Если названная процедура-вход закрыта, вызов процедуры-входа добавляется в очередь процедур-входов (как часть защищенной операции для вызова защищенной процедуры-входа), и вызов остается в очереди до его выбора или отмены; для каждой процедуры-входа заданной задачи или защищенного объекта (включая каждую процедуру-вход семейства процедур-входов) существует отдельная (логическая) очередь процедур-входов.
При выборе вызова из очереди он удаляется из своей очереди процедур-входов. Выбор вызова из определенной очереди процедур-входов называется обслуживанием очереди процедур-входов. Очередь процедур-входов может быть обслуживаема в следующих случаях:
  • Когда связанная задача достигает соответствующего оператора accept_statement или selective_accept с соответствующим открытым альтернативным оператором accept_alternative;
  • Если после выполнения, как части защищенной операции на связанном защищенном объекте, операции над объектом, отличной от вызова защищенной функции, процедура-вход проверяется и оказывается открытой.
Если в очереди есть хотя бы один вызов соответствующей открытой процедуры-входа, то один такой вызов выбирается в соответствии с действующей политикой очереди процедур-входов (см. ниже), и соответствующий оператор accept_statement или entry_body выполняется, как описано выше, для вызова процедуры-входа, который выбран немедленно.
Политика очереди процедур-входов управляет выбором среди вызовов в очередях как для задач, так и для защищенных процедур-входов. По умолчанию политика очереди процедур-входов заключается в выборе вызовов в данной очереди процедур-входов в порядке их прибытия. Если вызовы из двух или более очередей одновременно подходят для выбора, то по умолчанию политика очереди процедур-входов не определяет, какая очередь обслуживается первой. Другие политики очереди процедур-входов могут быть заданы с помощью pragma (см. D.4).
Для защищенного объекта вышеуказанное обслуживание очередей процедур-входов продолжается до тех пор, пока не останется открытых процедур-входов с вызовами в очереди, после чего защищенная операция завершается.
Для вызова процедуры-входа, который добавлен в очередь, и который не является оператором triggering_statement оператора asynchronous_select (см. 9.7.4), вызывающая задача блокируется до отмены вызова или выбора вызова, и соответствующий оператор accept_statement или entry_body завершается без переупорядочения. Кроме того, вызывающая задача блокируется во время взаимодействия.
Можно попытаться отменить вызов процедуры-входа при прерывании (см. 9.8) и как часть определенных форм оператора select_statement (см. 9.7.2, 9.7.3 и 9.7.4). Отмена не происходит до тех пор, пока вызов не находится в очереди процедур-входов и не защищен от отмены в рамках переупорядочения (см. 9.5.4); в такой момент вызов удаляется из очереди процедур-входов и завершается из-за отмены. Отмена вызова процедуры-входа защищенного объекта является защищенной операцией и, как таковая, не может произойти, пока происходит любая другая защищенная операция на защищенном объекте. Как и любая защищенная операция, она включает обслуживание очередей процедур-входов (в случае, если какой-либо барьер процедуры-входа зависит от атрибута Count).
Вызов процедуры-входа задачи, которая уже завершила свое выполнение, вызывает исключение Tasking_Error в момент вызова; аналогично, это исключение генерируется в момент вызова, если вызываемая задача завершает свое выполнение или становится аномальной до приема вызова или завершения взаимодействия (см. 9.8). Это относится как к простому вызову процедуры-входа, так и к вызову процедуры-входа как части оператора select_statement.

Разрешения реализации

Реализация может выполнять последовательность шагов защищенной операции, используя любой поток управления; это не обязательно должен быть поток управления задачи, которая запустила защищенную операцию. Если entry_body завершается без переупорядочения, то соответствующая вызывающая задача может быть подготовлена к работе без ожидания завершения всей защищенной операции.
При проверке, является ли процедура-вход защищенного объекта открытой, реализация не обязана повторно вычислять condition соответствующего барьера entry_barrier, если ни одна переменная или атрибут, на которые ссылается condition (прямо или косвенно), не была изменена в результате выполнения (или отмены) защищенной процедуры или вызова процедуры-входа на объекте с момента последнего вычисления condition.
END_OF_DOCUMENT_MARKER
Реализация может оценивать условие всех entry_barrier защищенного объекта в любой момент, когда проверяется открытость любого входа объекта.
При попытке отменить вызов входа, реализация не обязана выполнять эту попытку с помощью потока управления задачи (или прерывания), инициировавшего отмену; в частности, она может использовать поток управления вызывающего объекта для попытки отмены, даже если это может позволить выбрать вызов входа во временном интервале.
ПРИМЕЧАНИЯ
27 Если во время выполнения entry_body возникает исключение, оно передаётся соответствующему вызывающему объекту (см. 11.4).
28 Для вызова защищённого входа, вход проверяется на открытость до помещения вызова в очередь, и снова после этого, если его атрибут Count (см. 9.9) используется в каком-либо entry barrier.
29 Помимо простых вызовов входа, язык допускает временные, условные и асинхронные вызовы входа (см. 9.7.2, 9.7.3 и 9.7.4).
30 Условие entry_barrier может быть оценено реализацией чаще, чем строго необходимо, даже если эта оценка может иметь побочные эффекты. С другой стороны, реализация не обязана повторно оценивать условие, если ничто из ссылаемых им объектов не было обновлено промежуточным защищённым действием над защищённым объектом, даже если условие ссылается на некоторую глобальную переменную, которая могла быть обновлена действием, выполненным вне защищённого действия.

Примеры

Примеры вызовов входа:
Agent.Shut_Down; -- см. 9.1
Parser.Next_Lexeme(E); -- см. 9.1
Pool(5).Read(Next_Char); -- см. 9.1
Controller.Request(Low)(Some_Item); -- см. 9.1
Flags(3).Seize; -- см. 9.4


Spec-Zone.ru

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