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

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

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

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

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

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

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

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

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


Spec-Zone.ru

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