home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / s-rpc.ads < prev    next >
Text File  |  1996-09-28  |  5KB  |  135 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                           S Y S T E M . R P C                            --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.12 $                             --
  10. --                                                                          --
  11. -- This specification is adapted from the Ada Reference Manual for use with --
  12. -- GNAT.  In accordance with the copyright of that document, you can freely --
  13. -- copy and modify this specification,  provided that if you redistribute a --
  14. -- modified version,  any changes that you have made are clearly indicated. --
  15. --                                                                          --
  16. ------------------------------------------------------------------------------
  17.  
  18. with Ada.Streams;
  19. with System.Storage_Elements;
  20.  
  21. package System.RPC is
  22.  
  23.    type Partition_ID is range 0 .. 63; --  temporary declaration
  24.  
  25.    Communication_Error : exception;
  26.  
  27.    type Params_Stream_Type
  28.      (Initial_Size : Ada.Streams.Stream_Element_Count) is new
  29.        Ada.Streams.Root_Stream_Type with private;
  30.  
  31.    procedure Read
  32.      (Stream : in out Params_Stream_Type;
  33.       Item   : out Ada.Streams.Stream_Element_Array;
  34.       Last   : out Ada.Streams.Stream_Element_Offset);
  35.  
  36.    procedure Write
  37.      (Stream : in out Params_Stream_Type;
  38.       Item   : in Ada.Streams.Stream_Element_Array);
  39.  
  40.    --  Synchronous call
  41.  
  42.    procedure Do_RPC
  43.      (Partition  : in Partition_ID;
  44.       Params     : access Params_Stream_Type;
  45.       Result     : access Params_Stream_Type);
  46.  
  47.    --  Asynchronous call
  48.  
  49.    procedure Do_APC
  50.      (Partition  : in Partition_ID;
  51.       Params     : access Params_Stream_Type);
  52.  
  53.    --  The handler for incoming RPCs.
  54.  
  55.    type RPC_Receiver is
  56.      access procedure
  57.        (Params     : access Params_Stream_Type;
  58.         Result     : access Params_Stream_Type);
  59.  
  60.    procedure Establish_RPC_Receiver (
  61.       Partition : in Partition_ID;
  62.       Receiver  : in RPC_Receiver);
  63.  
  64. private
  65.  
  66.    Std_Length : constant Ada.Streams.Stream_Element_Count := 1024;
  67.  
  68.    type Packet_Type (Length : Ada.Streams.Stream_Element_Count) is
  69.       record
  70.          Content : aliased Ada.Streams.Stream_Element_Array (1 .. Length);
  71.          First   : Ada.Streams.Stream_Element_Offset := 1;
  72.          Last    : Ada.Streams.Stream_Element_Offset := 0;
  73.       end record;
  74.    --  Each packet has a content and two indexes, First and Last.
  75.    --  First and Last are used by Read and Write to know
  76.    --  (resp.) where to start to read and where to start to write
  77.  
  78.    type Packet_Node;
  79.    type Packet_Node_Access is access Packet_Node;
  80.    type Packet_Node is
  81.       record
  82.          Packet : Packet_Type (Std_Length);
  83.          Next   : Packet_Node_Access;
  84.       end record;
  85.  
  86.    type Packet_List_Type is
  87.       record
  88.          Head     : Packet_Node_Access;
  89.          Tail     : Packet_Node_Access;
  90.       end record;
  91.  
  92.    type Initial_Stream_Access is access Packet_Type;
  93.  
  94.    type Params_Stream_Type
  95.      (Initial_Size : Ada.Streams.Stream_Element_Count) is new
  96.        Ada.Streams.Root_Stream_Type with
  97.        record
  98.           Initial : Initial_Stream_Access;
  99.           Extra   : Packet_List_Type;
  100.        end record;
  101.    --  Two kinds of storage in a stream :
  102.    --   o an initial storage initialized during the declaration
  103.    --   o an extra storage with a linked list of fixed size packets
  104.    --     used during execution when the initial storage is not sufficient
  105.  
  106.    procedure Head_Node
  107.      (Index  :    out Packet_Node_Access;
  108.       Stream : in     Params_Stream_Type);
  109.    --  Set index to the first packet of the extra storage
  110.  
  111.    procedure Tail_Node
  112.      (Index  :    out Packet_Node_Access;
  113.       Stream : in     Params_Stream_Type);
  114.    --  Set index to the last packet of the extra storage
  115.  
  116.    function Null_Node
  117.      (Index : Packet_Node_Access)
  118.      return Boolean;
  119.    --  True if null
  120.  
  121.    procedure Delete_Head_Node
  122.      (Stream : in out Params_Stream_Type);
  123.    --  Delete the first node and free it
  124.  
  125.    procedure Next_Node
  126.      (Node : in out Packet_Node_Access);
  127.    --  Node is set to the next node
  128.    --  If not possible, Stream_Error is raised
  129.  
  130.    procedure Append_New_Node
  131.      (Stream : in out Params_Stream_Type);
  132.    --  Create a new node at the end of the extra storage
  133.  
  134. end System.RPC;
  135.