Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

E.4 Дистанционные вызовы подпрограмм

Дистанционный вызов подпрограммы — это вызов подпрограммы, который вызывает выполнение подпрограммы в другом (активном) разделе. Раздел, который инициирует дистанционный вызов подпрограммы, является вызывающим разделом, а раздел, который выполняет тело соответствующей подпрограммы, — вызываемым разделом. Некоторые вызовы удалённых процедур разрешены для возврата до завершения выполнения подпрограммы. Они называются асинхронными дистанционными вызовами процедур.
Существует три разных способа выполнения дистанционного вызова подпрограммы:
  • Как прямой вызов (удаленной) подпрограммы, явно объявленной в интерфейсе дистанционного вызова;
  • Как непрямой вызов через значение типа дистанционного доступа к подпрограмме;
  • Как вызов распределения с управляющим операндом, обозначенным значением типа дистанционного доступа к типу класса.
Первый способ вызова соответствует статической связи между вызывающим и вызываемым разделом. Последние два способа соответствуют динамической связи между вызывающим и вызываемым разделом.
Библиотечные единицы типов удалённых типов (см. E.2.2) и библиотечные единицы интерфейса дистанционного вызова (см. E.2.3) определяют дистанционные подпрограммы или типы дистанционного доступа, используемые для дистанционных вызовов подпрограмм.

Правила допустимости

При вызове распределения с двумя или более управляющими операндами, если один управляющий операнд обозначен значением типа дистанционного доступа к типу класса, то все должны быть.
Неблокируемый программный модуль не должен содержать, кроме как внутри вложенных модулей с Неблокирующим, указанным как статически False, вызов распределения с управляющим операндом, обозначенным значением типа дистанционного доступа к типу класса.

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

Для выполнения удалённого вызова подпрограммы параметры подпрограммы (а позднее и результаты, если таковые имеются) передаются с помощью потокового представления (см. 13.13.1), которое подходит для передачи между разделами. Этот процесс называется маршаллированием. Распаковкой является обратный процесс реконструирования параметров или результатов из потокового представления. Маршаллирование выполняется первоначально как часть дистанционного вызова подпрограммы в вызывающем разделе; распаковка выполняется в вызываемом разделе. После завершения подпрограммы маршаллирование выполняется в вызываемом разделе, а затем распаковка — в вызывающем разделе.
Вызываемый заглушка — это последовательность кода, которая заменяет тело подпрограммы удалённо вызываемой подпрограммы в вызывающем разделе. Принимающая заглушка — это последовательность кода («обёртка»), которая получает вызов дистанционной подпрограммы в вызываемом разделе и вызывает соответствующее тело подпрограммы.
Дистанционные вызовы подпрограмм выполняются не более одного раза, то есть если вызов подпрограммы возвращается нормально, то тело вызываемой подпрограммы выполняется ровно один раз.
Задача, выполняющая дистанционный вызов подпрограммы, блокируется до возврата подпрограммы в вызываемом разделе, если вызов не асинхронный. Для асинхронного удалённого вызова процедуры вызывающая задача может стать готовой до возврата процедуры в вызываемом разделе.
Если конструктор, содержащий дистанционный вызов, прерывается, дистанционный вызов подпрограммы отменяется. Будет ли выполнение удалённой подпрограммы немедленно прервано в результате отмены, определяется реализацией.
Если дистанционный вызов подпрограммы получен вызываемым разделом до завершения его разработки, вызов сохраняется в ожидании до завершения разработки вызываемого раздела (если вызов не отменён вызывающим разделом до этого).
Если исключение распространяется удалённо вызываемой подпрограммой, а вызов не является асинхронным, соответствующее исключение повторно возбуждается в точке дистанционного вызова подпрограммы. При асинхронном вызове, если дистанционный вызов процедуры возвращается до завершения выполнения удалённо вызываемой подпрограммы, любое исключение теряется.
Исключение Communication_Error (см. E.5) возбуждается, если дистанционный вызов не может быть завершён из-за трудностей в общении с вызываемым разделом.
Все формы дистанционных вызовов подпрограмм потенциально являются блокирующими операциями (см. 9.5).
При дистанционном вызове подпрограммы с формальным параметром типа класса выполняется проверка, что тег фактического параметра идентифицирует тип тегированного типа, объявленного в единице библиотеки, объявленной в чистом или общем пассивном режиме, или в видимой части библиотечной единицы удалённых типов или интерфейса удалённого вызова. Program_Error возбуждается, если эта проверка терпит неудачу. При удалённом вызове функции, возвращающей тип класса, выполняется та же проверка по результату функции.
При вызове распределения с двумя или более управляющими операндами, обозначенными значениями типа дистанционного доступа к типу класса, выполняется проверка (в дополнение к обычной Tag_Check — см. 11.5), что все значения дистанционного доступа к типу класса произошли из Access attribute_reference, которые были оценены задачами одного и того же активного раздела. Constraint_Error возбуждается, если эта проверка терпит неудачу.

Требования к реализации

Реализация дистанционных вызовов подпрограмм должна соответствовать интерфейсу PCS, как определено в спецификации пакет System.RPC, определённого в языке (см. E.5). Вызывающая заглушка должна использовать процедуру Do_RPC, если вызов удалённой процедуры не является асинхронным, в этом случае используется Do_APC. Со стороны приёмника соответствующая принимающая заглушка вызывается приемником RPC.
В отношении общих переменных в общих пассивных библиотечных единицах выполнение соответствующего тела подпрограммы синхронного удалённого вызова процедуры считается частью выполнения вызывающей задачи. Выполнение соответствующего тела подпрограммы асинхронного удалённого вызова процедуры происходит параллельно с вызывающей задачей и не сигнализирует о следующем действии вызывающей задачи (см. 9.10).
ПРИМЕЧАНИЕ 1. Данный активный раздел может как совершать, так и получать дистанционные вызовы подпрограмм. Таким образом, активный раздел может выступать в роли клиента и сервера.
ПРИМЕЧАНИЕ 2. Если данное исключение распространяется вызовом удалённой подпрограммы, но исключения не существует в вызывающем разделе, исключение может быть обработано вариантом others или быть передано и обработано третьим разделом.


Spec-Zone.ru

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