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

E.5 Подсистема связи между разделами

Подсистема связи между разделами (PCS) предоставляет средства для поддержки связи между активными разделами распределённой программы. Пакет System.RPC является определённым языком интерфейсом к PCS.

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

Существует следующий определяемый языком пакет библиотеки:
with Ada.Streams; -- см. 13.13.1
package System.RPC
with Nonblocking => False, Global => in out synchronized is
type Partition_Id is range 0 .. определяемое реализацией;
Communication_Error : exception;
type Params_Stream_Type (
Initial_Size : Ada.Streams.Stream_Element_Count) is new
Ada.Streams.Root_Stream_Type with private;
procedure Read(
Stream : in out Params_Stream_Type;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
procedure Write(
Stream : in out Params_Stream_Type;
Item : in Ada.Streams.Stream_Element_Array);
-- Синхронный вызов
procedure Do_RPC(
Partition : in Partition_Id;
Params : access Params_Stream_Type;
Result : access Params_Stream_Type);
-- Асинхронный вызов
procedure Do_APC(
Partition : in Partition_Id;
Params : access Params_Stream_Type);
-- Обработчик входящих RPC-вызовов
type RPC_Receiver is access procedure(
Params : access Params_Stream_Type;
Result : access Params_Stream_Type);
procedure Establish_RPC_Receiver(
Partition : in Partition_Id;
Receiver : in RPC_Receiver);
private
... -- не определено языком
end System.RPC;
Значение типа Partition_Id используется для идентификации раздела.
Объект типа Params_Stream_Type используется для идентификации конкретной удалённой подпрограммы, которая вызывается, а также для маршалинга и размаршалинга параметров или результата вызова удалённой подпрограммы в процессе их передачи между разделами.
Процедуры Read и Write переопределяют соответствующие абстрактные операции для типа Params_Stream_Type.

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

Процедуры Do_RPC и Do_APC отправляют сообщение в активный раздел, идентифицируемый параметром Partition.
После отправки сообщения Do_RPC блокирует вызывающую задачу до получения ответного сообщения от вызываемого раздела или до обнаружения ошибки подлежащей системой связи, в этом случае исключение Communication_Error возникает в момент вызова Do_RPC.
Do_APC работает так же, как Do_RPC, за исключением того, что она может возвращаться сразу после отправки сообщения.
При нормальном возврате поток, обозначенный параметром Result процедуры Do_RPC, содержит ответное сообщение.
Процедура System.RPC.Establish_RPC_Receiver вызывается один раз сразу после обработки библиотечных модулей активного раздела (то есть сразу после _обработки раздела_), если раздел включает модуль библиотеки RCI, но до вызова основной подпрограммы, если таковая имеется. Параметр Partition — это Partition_Id активного раздела, который обрабатывается. Параметр Receiver обозначает предоставляемую реализацией процедуру, называемую _приёмником RPC_, которая будет обрабатывать все RPC-вызовы, полученные разделом от PCS. Establish_RPC_Receiver сохраняет ссылку на приёмник RPC; при получении сообщения в вызываемом разделе приёмник RPC вызывается с потоком Params, содержащим сообщение. После возвращения приёмника RPC содержимое потока, обозначенного параметром Result, помещается в сообщение и отправляется обратно в вызывающий раздел.
Если вызов Do_RPC прерывается, то отправляется сообщение об отмене в вызываемый раздел, чтобы запросить прерывание выполнения удалённо вызываемой подпрограммы.
Этот абзац был удалён.

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

Реализация приёмника RPC должна быть рекурсивной, что позволяет одновременным вызовам от PCS обслуживать одновременные удалённые вызовы подпрограмм в раздел.
Реализация не должна ограничивать замену тела System.RPC. Реализация не должна ограничивать потомков System.RPC. Соответствующие разрешения реализации в введении к приложению A не применяются.
Если реализация System.RPC предоставляется пользователем, то реализация должна поддерживать удалённые вызовы подпрограмм, как указано.

Требования к документации

Реализация PCS должна документировать, вызывается ли приёмник RPC из одновременных задач. Если есть верхний предел для числа таких задач, то этот предел также должен быть задокументирован, а также механизмы его конфигурации (если это поддерживается).

Разрешения реализации

PCS может содержать определённые реализацией интерфейсы для явного обмена сообщениями, вещания и т. д. Аналогично, он может предоставлять дополнительные интерфейсы для запроса состояния некоторого удалённого раздела (учитывая его идентификатор раздела) или самого PCS, для установки таймаутов и параметров повторных попыток, получения более подробного состояния ошибок и т. д. Эти дополнительные интерфейсы должны предоставляться в пакетах-потомках System.RPC.
Тело пакета System.RPC не обязательно должно предоставляться реализацией.
Допускается альтернативное объявление для пакета System.RPC, если оно предоставляет набор операций, существенно эквивалентный спецификации, определённой в этом подпункте.

Рекомендации по реализации

По возможности PCS в вызываемом разделе должен позволять нескольким задачам вызывать приёмник RPC с различными сообщениями и должен разрешать им блокироваться до возвращения соответствующего тела подпрограммы.
Операция Write над потоком типа Params_Stream_Type должна вызывать исключение Storage_Error, если она исчерпывает память, пытаясь записать Item в поток.
ПРИМЕЧАНИЕ Пакет System.RPC не предназначен для прямого вызова пользовательскими программами. Вместо этого он предназначен для использования в реализации удалённых вызовов подпрограмм, вызываемых вызываемыми "stub"-модулями, сгенерированными для модуля библиотеки интерфейса удалённого вызова для инициирования удалённого вызова, а также вызываемыми в ответ приёмником RPC, который перенаправляет вызов к принимающим "stub"-модулям, сгенерированным для тела интерфейса удалённого вызова, для обработки удалённого вызова, полученного откуда-либо.


Spec-Zone.ru

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