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

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

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

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

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

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

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

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

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


Spec-Zone.ru

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