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

9.5.4 Операторы requeue

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

Синтаксис

requeue_statement ::= requeue procedure_or_entry_name [with abort];

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

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

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

Оператор requeue_statement должен находиться внутри вызываемого блока, который является либо entry_body, либо accept_statement, и этот блок должен быть самым внутренним окружающим блоком или вызываемым блоком.
Если у цели перенаправления есть параметры, то ее (префиксный) профиль должен быть согласован по подтипу с профилем самого внутреннего окружающего вызываемого блока.
Для оператора перенаправления, где самый внутренний вызываемый блок предназначен для входа E1, для каждого конкретного или общеклассового пост-условия выражения P1, применимого к E1, должно существовать пост-условие выражение P2, применимое к цели перенаправления E2, такое что
  • P1 полностью соответствует выражению, полученному заменой каждой ссылки в P2 на формальный параметр E2 ссылкой на соответствующий формальный параметр E1; и
  • если P1 активен, то P2 также активен.
Целью перенаправления не должно быть применимое конкретное или общеклассовое пост-условие, включающее атрибут Old.
Если цель перенаправления объявлена непосредственно внутри task_definition типа задачи с именем или protected_definition именованного защищенного типа, и если оператор перенаправления находится в теле этого типа, и если перенаправление является внешним, то цель перенаправления не должна иметь конкретного или общеклассового пост-условия, включающего имя текущего экземпляра этого типа или любого сущности, объявленной в объявлении этого типа.
Если целью является процедура, то имя должно указывать на переименование входа или должно указывать на представление или префиксное представление примитивной подпрограммы синхронизированного интерфейса, где первый параметр не-префиксного представления примитивной подпрограммы должен быть управляющим параметром, а аспект Synchronization должен быть указан с synchronization_kind By_Entry для примитивной подпрограммы.
В операторе requeue_statement оператора accept_statement некоторого блока задачи, либо целевой объект должен быть частью формального параметра accept_statement, либо уровень доступности целевого объекта не должен быть равен или статически глубже любого окружающего accept_statement блока задачи. В операторе requeue_statement оператора entry_body некоторого защищенного блока, либо целевой объект должен быть частью формального параметра entry_body, либо уровень доступности целевого объекта не должен быть статически глубже, чем уровень entry_declaration для entry_body.

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

Выполнение оператора requeue_statement происходит путем сначала вычисления имени procedure_or_entry_name, включая префикс, определяющий целевую задачу или защищенный объект, и выражение, определяющее вход внутри семейства входов, если таковой имеется. Затем выполняются проверки условий предварительных условий, как и при вызове целевого входа или подпрограммы. Затем завершается, завершается и покидается (см. 7.6.1) окружающий entry_body или accept_statement, содержащий requeue_statement.
При выполнении перенаправления на вход целевой задачи после выхода из окружающего вызываемого блока, проверяется, открыт ли именованный вход, и перенаправленный вызов либо выбирается немедленно, либо помещается в очередь, как и при обычном вызове входа (см. 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.
ПРИМЕЧАНИЯ
32 Перенаправление разрешено от одного входа к входу семейства входов или наоборот. Индекс входа, если таковой имеется, не играет никакой роли в проверке согласованности подтипов между профилями двух входов; индекс входа является частью имени entry_name входа семейства.

Примеры

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


Spec-Zone.ru

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