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

E.4 Вызовы удалённых подпрограмм

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

Правила законности

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

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

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

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

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


Spec-Zone.ru

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