Справочник по Ada 2012
Подсистема связи между разделами
Подсистема связи между разделами (PCS) предоставляет средства для поддержки связи между активными разделами распределенной программы. Пакет System.RPC является языковой интерфейсом к PCS.
Статическая семантика
Существует следующий языковой пакет библиотеки:
с Ada.Streams; -- см. 13.13.1
пакет System.RPC является
пакет System.RPC является
тип Partition_Id диапазон 0 .. определяется реализацией;
Communication_Error : исключение;
тип Params_Stream_Type (
Initial_Size : Ada.Streams.Stream_Element_Count) является новым
Ada.Streams.Root_Stream_Type с частным;
Initial_Size : Ada.Streams.Stream_Element_Count) является новым
Ada.Streams.Root_Stream_Type с частным;
процедура Read(
Stream : ввод-вывод Params_Stream_Type;
Item : вывод Ada.Streams.Stream_Element_Array;
Last : вывод Ada.Streams.Stream_Element_Offset);
Stream : ввод-вывод Params_Stream_Type;
Item : вывод Ada.Streams.Stream_Element_Array;
Last : вывод Ada.Streams.Stream_Element_Offset);
процедура Write(
Stream : ввод-вывод Params_Stream_Type;
Item : ввод Ada.Streams.Stream_Element_Array);
Stream : ввод-вывод Params_Stream_Type;
Item : ввод Ada.Streams.Stream_Element_Array);
-- Синхронный вызов
процедура Do_RPC(
Partition : ввод Partition_Id;
Params : доступ Params_Stream_Type;
Result : доступ Params_Stream_Type);
процедура Do_RPC(
Partition : ввод Partition_Id;
Params : доступ Params_Stream_Type;
Result : доступ Params_Stream_Type);
-- Асинхронный вызов
процедура Do_APC(
Partition : ввод Partition_Id;
Params : доступ Params_Stream_Type);
процедура Do_APC(
Partition : ввод Partition_Id;
Params : доступ Params_Stream_Type);
-- Обработчик входящих вызовов RPC
тип RPC_Receiver является доступом к процедуре(
Params : доступ Params_Stream_Type;
Result : доступ Params_Stream_Type);
тип RPC_Receiver является доступом к процедуре(
Params : доступ Params_Stream_Type;
Result : доступ Params_Stream_Type);
процедура Establish_RPC_Receiver(
Partition : ввод Partition_Id;
Receiver : ввод RPC_Receiver);
Partition : ввод Partition_Id;
Receiver : ввод RPC_Receiver);
частный
... -- не определено языком
конец System.RPC;
... -- не определено языком
конец 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. Соответствующие разрешения на реализацию во введении к Приложению A не применяются.
Если реализация System.RPC предоставляется пользователем, то реализация должна поддерживать вызовы удалённых подпрограмм, как указано.
Требования к документации
Реализация PCS должна документировать, вызывается ли приёмник RPC из конкурирующих задач. Если есть верхний предел числа таких задач, этот предел также должен быть задокументирован, вместе с механизмами его настройки (если это поддерживается).
Разрешения на реализацию
PCS разрешается содержать реализуемые интерфейсы для явного обмена сообщениями, вещания и т. д. Аналогично, разрешается предоставление дополнительных интерфейсов для запроса состояния некоторого удаленного раздела (с учётом его идентификатора раздела) или самого PCS, для установки таймаутов и параметров повторных попыток, для получения более подробной информации об ошибках и т. д. Эти дополнительные интерфейсы должны предоставляться в дочерних пакетах System.RPC.
Реализация пакета System.RPC не обязана предоставляться реализацией.
Разрешается альтернативное объявление пакета System.RPC, при условии, что он предоставляет набор операций, существенно эквивалентный спецификации, определённой в этом подпункте.
Рекомендации по реализации
По возможности, PCS на вызываемом разделе должен позволять нескольким задачам вызывать приёмник RPC с различными сообщениями и должен позволять им блокироваться до тех пор, пока не вернётся соответствующее тело подпрограммы.
Операция Write над потоком типа Params_Stream_Type должна возбуждать Storage_Error, если при попытке записи Item в поток закончится место.
ПРИМЕЧАНИЯ
10 Пакет System.RPC не предназначен для прямого вызова пользовательскими программами. Он предназначен для использования в реализации вызовов удалённых подпрограмм, вызываемых вызывающими заглушками, сгенерированными для библиотеки единиц удалённого интерфейса вызова, чтобы начать удалённый вызов, и, в свою очередь, вызывающими приёмник RPC, который перенаправляет вызов на заглушки получателя, сгенерированные для тела удалённого интерфейса вызова, чтобы обработать удалённый вызов, полученный извне.