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

Пример использования удалённого доступа к типу класса

Примеры

Пример использования удалённого доступа к типу класса для достижения динамической связи между активными разделами:
package Tapes is
pragma Pure(Tapes);
type Tape is abstract tagged limited private;
-- Примитивные операции диспетчеризации, где
-- Tape управляет операндом
procedure Copy (From, To : access Tape; Num_Recs : in Natural) is abstract;
procedure Rewind (T : access Tape) is abstract;
-- Дополнительные операции
private
type Tape is ...
end Tapes;
with Tapes;
package Name_Server is
pragma Remote_Call_Interface;
-- Динамическая привязка к удалённым операциям достигается
-- с помощью типа доступа к ограниченному типу класса Tape_Ptr
type Tape_Ptr is access all Tapes.Tape'Class;
-- Следующие статически связанные удалённые операции
-- позволяют в этом примере реализовать функцию имени сервера
function Find (Name : String) return Tape_Ptr;
procedure Register (Name : in String; T : in Tape_Ptr);
procedure Remove (T : in Tape_Ptr);
-- Дополнительные операции
end Name_Server;
package Tape_Driver is
-- Объявления не показаны, они здесь не важны
end Tape_Driver;
with Tapes, Name_Server;
package body Tape_Driver is
type New_Tape is new Tapes.Tape with ...
procedure Copy
(From, To : access New_Tape; Num_Recs: in Natural) is
begin
. . .
end Copy;
procedure Rewind (T : access New_Tape) is
begin
. . .
end Rewind;
-- Объекты удалённо доступны через использование
-- операций Name_Server
Tape1, Tape2 : aliased New_Tape;
begin
Name_Server.Register ("NINE-TRACK", Tape1'Access);
Name_Server.Register ("SEVEN-TRACK", Tape2'Access);
end Tape_Driver;
with Tapes, Name_Server;
-- Tape_Driver не требуется и поэтому не указан в with_clause
procedure Tape_Client is
T1, T2 : Name_Server.Tape_Ptr;
begin
T1 := Name_Server.Find ("NINE-TRACK");
T2 := Name_Server.Find ("SEVEN-TRACK");
Tapes.Rewind (T1);
Tapes.Rewind (T2);
Tapes.Copy (T1, T2, 3);
end Tape_Client;
Примечания к примеру:
Этот абзац был удалён.
  • Пакет Tapes предоставляет необходимые объявления типа и его примитивных операций.
  • Name_Server — это пакет удалённого вызова интерфейса, разработанный в отдельном активном разделе для предоставления необходимых служб именования (таких как Register и Find) для всей распределённой программы через удалённые вызовы подпрограмм.
  • Tape_Driver — это обычный пакет, который разработан в разделе, настроенном на процессорном узле, подключенном к устройствам ленточной памяти. Абстрактные операции переопределяются для поддержки локально объявленных устройств ленточной памяти (Tape1, Tape2). Пакет не виден своим клиентам, но он экспортирует устройства ленточной памяти (как удалённые объекты) через службы Name_Server. Это позволяет добавлять, удалять или заменять устройства ленточной памяти динамически без необходимости изменения кода клиентов.
  • Процедура Tape_Client ссылается только на объявления в пакетах Tapes и Name_Server. Перед первым использованием ленточной памяти необходимо запросить у Name_Server идентификатор этой ленты в системе. После этого можно использовать этот идентификатор для доступа к устройству ленточной памяти.
  • Значения типа удалённого доступа Tape_Ptr содержат необходимую информацию для выполнения удалённых операций диспетчеризации, которые являются результатом обращения к управляющим операндам T1 и T2.


Spec-Zone.ru

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