Next: , Previous: E.4.1, Up: E.4


E.4.2 Example of Use of a Remote Access-to-Class-Wide Type

Examples

1
Example of using a remote access−to−class−wide type to achieve dynamic binding across active partitions:

2

     package Tapes is
        pragma Pure(Tapes);
        type Tape is abstract tagged limited private;
        −− Primitive dispatching operations where
        −− Tape is controlling operand
        procedure Copy (From, To access Tape; Num_Recs in Natural) is abstract;
        procedure Rewind (T access Tape) is abstract;
        −− More operations
     private
        type Tape is ...
     end Tapes;

3

     with Tapes;
     package Name_Server is
        pragma Remote_Call_Interface;
        −− Dynamic binding to remote operations is achieved
        −− using the access−to−limited−class−wide type Tape_Ptr
        type Tape_Ptr is access all Tapes.Tape'Class;
        −− The following statically bound remote operations
        −− allow for name−server capability in this example
        function  Find     (Name String) return Tape_Ptr;
        procedure Register (Name in String; in Tape_Ptr);
        procedure Remove   (T in Tape_Ptr);
        −− More operations
     end Name_Server;

4

     package Tape_Driver is
       −− Declarations are not shown, they are irrelevant here
     end Tape_Driver;

5

     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;
        −− Objects remotely accessible through use
        −− of Name_Server operations
        Tape1, Tape2 aliased New_Tape;
     begin
        Name_Server.Register ("NINE−TRACK",  Tape1'Access);
        Name_Server.Register ("SEVEN−TRACK", Tape2'Access);
     end Tape_Driver;

6

     with Tapes, Name_Server;
     −− Tape_Driver is not needed and thus not mentioned in the 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;

7
Notes on the example:

7.a

Discussion: The example does not show the case where tapes are removed from or added to the system. In the former case, an appropriate exception needs to be defined to instruct the client to use another tape. In the latter, the Name_Server should have a query function visible to the clients to inform them about the availability of the tapes in the system.

8/1
This paragraph was deleted.

9

10

11

12

13