Справочник Ada 2005
Подсистема связи между разделами E.5
Подсистема связи между разделами (PCS) предоставляет средства для поддержки связи между активными разделами распределённой программы. Пакет System.RPC является языковым интерфейсом к PCS.
Статическая семантика
Существует следующий языковой пакет библиотеки:
with Ada.Streams; -- см. 13.13.1
package System.RPC is
package System.RPC 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;
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);
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);
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_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);
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);
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);
Partition : in Partition_Id;
Receiver : in RPC_Receiver);
private
... -- не определено языком
end System.RPC;
... -- не определено языком
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 прерван, то в вызываемый раздел отправляется сообщение об отмене, чтобы запросить прерывание выполнения вызываемой удалённой подпрограммы.
Подпрограммы, объявленные в System.RPC, потенциально являются блокирующими операциями.
Требования к реализации
Реализация приемника RPC должна быть рекурсивной, что позволяет одновременным вызовам от PCS обслуживать одновременные удалённые вызовы подпрограмм в раздел.
Реализация не должна ограничивать замену тела System.RPC. Реализация не должна ограничивать потомков System.RPC. Соответствующие разрешения реализации в введении к Приложению А не применяются.
Если реализация System.RPC предоставляется пользователем, то реализация должна поддерживать вызовы удалённых подпрограмм, как указано.
Требования к документации
Реализация PCS должна документировать, вызывается ли приемник RPC из нескольких задач. Если есть верхний предел для числа таких задач, то этот предел также должен быть задокументирован вместе с механизмами его настройки (если это поддерживается).
Разрешения на реализацию
PCS разрешается содержать определяемые реализацией интерфейсы для явного обмена сообщениями, широковещательной рассылки и т. д. Аналогично, разрешается предоставлять дополнительные интерфейсы для запроса состояния удалённого раздела (при заданном идентификаторе раздела) или самого PCS, для установки таймаутов и параметров повторных попыток, для получения более подробной информации об ошибке и т. д. Эти дополнительные интерфейсы должны быть предоставлены в дочерних пакетах System.RPC.
Реализация пакета System.RPC не должна поставляться реализацией.
Разрешена альтернативная декларация пакета System.RPC, при условии что она предоставляет набор операций, существенно эквивалентный спецификации, определённой в этом пункте.
Рекомендации по реализации
В случае возможности PCS в вызываемом разделе должен позволять нескольким задачам вызывать приемник RPC с различными сообщениями и должен позволять им блокироваться до возврата соответствующего тела подпрограммы.
Операция Write на потоке типа Params_Stream_Type должна поднимать Storage_Error, если при записи Item в поток будет обнаружено отсутствие места.
ПРИМЕЧАНИЯ
8 Пакет System.RPC не предназначен для непосредственного вызова пользовательскими программами. Он предназначен для использования в реализации вызовов удалённых подпрограмм, вызывается вызываемыми «заглушками» для удалённого интерфейса вызова библиотечных модулей, чтобы инициировать удалённый вызов, а затем обращается к приемнику RPC, который передает управление «заглушкам» получателя, сгенерированным для тела удалённого интерфейса вызова, чтобы обработать полученный удалённый вызов из другого места.