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

9.5.4 Операторы перенаправления

Оператор 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 (это requeue-with-abort), то:
  • если исходный вызов входа был прерван (см. 9.8), то перенаправление действует как точка завершения прерывания для вызова, вызов отменяется, и перенаправление не выполняется;
  • если исходный вызов входа был с таймером (или условным), то исходное время истечения срока — это время истечения срока для перенаправленного вызова.
Если зарезервированные слова with abort отсутствуют, то вызов остаётся защищённым от отмены во время нахождения в очереди в результате оператора requeue_statement.
ПРИМЕЧАНИЯ
31 Перенаправление разрешено от одного входа к входу семейства входов или наоборот. Индекс входа, если таковой имеется, не участвует в проверке соответствия подтипов между профилями двух входов; индекс входа является частью имени entry_name для входа семейства.

Примеры

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


Spec-Zone.ru

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