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

9.5.4 Операторы requeue

Оператор requeue_statement может быть использован для завершения оператора accept_statement или entry_body, одновременно перенаправляя соответствующий вызов входа в новую (или ту же) очередь входов. Такое перенаправление может выполняться с или без разрешения промежуточного отмены вызова из-за прерывания или истечения срока действия отсрочки.

Синтаксис

requeue_statement ::= requeue entry_name [with abort];

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

Имя entry_name оператора requeue_statement должно ссылаться на вход (целевой вход), который либо не имеет параметров, либо имеет профиль, совместимый по типу (см. 6.3.1) с профилем внутреннего вложенного entry_body или accept_statement.

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

Оператор requeue_statement должен находиться внутри вызываемого конструкта, который является либо entry_body, либо accept_statement, и этот конструкт должен быть самым вложенным.
Если целевой вход имеет параметры, то его профиль должен быть совместим по подтипу с профилем самого вложенного вызываемого конструкта.
В операторе requeue_statement оператора accept_statement некоторого блока задачи, либо целевой объект должен быть частью формального параметра оператора accept_statement, либо уровень доступа к целевому объекту не должен быть равен или статически глубже любого вложенного accept_statement блока задачи. В операторе requeue_statement оператора entry_body некоторого защищенного блока либо целевой объект должен быть частью формального параметра entry_body, либо уровень доступа к целевому объекту не должен быть статически глубже, чем уровень entry_declaration.

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

Выполнение оператора requeue_statement происходит путём сначала оценки entry_name, включая префикс, определяющий целевую задачу или защищенный объект, и выражение, определяющее вход в семействе входов, если таковое имеется. entry_body или accept_statement, содержащий requeue_statement, затем завершается, окончательно завершается и покидается (см. 7.6.1).
При выполнении перенаправления на вход целевой задачи, после выхода из вложенного вызываемого конструкта, проверяется, открыт ли указанный вход, и перенаправленный вызов либо выбирается немедленно, либо помещается в очередь, как при обычном вызове входа (см. 9.5.3).
При выполнении перенаправления на вход целевого защищенного объекта, после выхода из вложенного вызываемого конструкта:
  • если перенаправление является внутренним перенаправлением (т.е., перенаправление обратно на вход того же защищенного объекта – см. 9.5), вызов добавляется в очередь указанного входа, и текущее действие защиты продолжается (см. 9.5.1);
  • если перенаправление является внешним перенаправлением (т.е., целевой защищенный объект не явным образом совпадает с текущим объектом – см. 9.5), действие защиты запускается на целевом объекте и продолжается, как при обычном вызове входа (см. 9.5.3).
Если новый вход, указанный в операторе requeue_statement, имеет формальные параметры, то во время выполнения оператора accept_statement или entry_body, соответствующего новому входу, формальные параметры обозначают те же объекты, что и соответствующие формальные параметры вызываемого конструкта, завершённого перенаправлением. В любом случае, в операторе requeue_statement не указываются параметры; передача параметров подразумевается.
Если requeue_statement включает ключевые слова with abort (это перенаправление-с-отменой), то:
  • если исходный вызов входа был прерван (см. 9.8), то перенаправление действует как точка завершения прерывания вызова, и вызов отменяется, и перенаправление не выполняется;
  • если исходный вызов входа был с таймером (или условным), то исходное время истечения срока действия является временем истечения срока действия для перенаправленного вызова.
Если ключевые слова with abort не присутствуют, то вызов остаётся защищённым от отмены во время ожидания в очереди в результате оператора requeue_statement.
ПРИМЕЧАНИЯ
30 Разрешено перенаправление из одного входа во вход семейства входов, или наоборот. Индекс входа, если таковой имеется, не играет роли в проверке соответствия подтипов между профилями двух входов; индекс входа является частью entry_name для входа семейства.

Примеры

Примеры операторов requeue:
requeue Request(Medium) with abort;
-- перенаправление на члена семейства входов текущей задачи, см. 9.1
requeue Flags(I).Seize;
-- перенаправление на вход компонента массива, см. 9.4


Spec-Zone.ru

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