Package Name: system.rpc

Return to: Package List


------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                           S Y S T E M . R P C                            --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--                            $Revision: 1.12 $                             --
--                                                                          --
-- This specification is adapted from the Ada Reference Manual for use with --
-- GNAT.  In accordance with the copyright of that document, you can freely --
-- copy and modify this specification,  provided that if you redistribute a --
-- modified version,  any changes that you have made are clearly indicated. --
--                                                                          --

------------------------------------------------------------------------------
with Ada.Streams;

with System.Storage_Elements;

package System.RPC is

   type Partition_ID is range 0 .. 63; --  temporary declaration

   Communication_Error : exception;
   type Params_Stream_Type
     (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);
   procedure Write
     (Stream : in out Params_Stream_Type;

      Item   : in Ada.Streams.Stream_Element_Array);

   --  Synchronous call
   procedure Do_RPC
     (Partition  : in Partition_ID;
      Params     : access Params_Stream_Type;

      Result     : access Params_Stream_Type);

   --  Asynchronous call
   procedure Do_APC
     (Partition  : in Partition_ID;

      Params     : access Params_Stream_Type);

   --  The handler for incoming RPCs.
   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);

private

   Std_Length : constant Ada.Streams.Stream_Element_Count := 1024;
   type Packet_Type (Length : Ada.Streams.Stream_Element_Count) is
      record
         Content : aliased Ada.Streams.Stream_Element_Array (1 .. Length);
         First   : Ada.Streams.Stream_Element_Offset := 1;
         Last    : Ada.Streams.Stream_Element_Offset := 0;
      end record;
   --  Each packet has a content and two indexes, First and Last.
   --  First and Last are used by Read and Write to know

   --  (resp.) where to start to read and where to start to write
   type Packet_Node;
   type Packet_Node_Access is access Packet_Node;
   type Packet_Node is
      record
         Packet : Packet_Type (Std_Length);
         Next   : Packet_Node_Access;

      end record;
   type Packet_List_Type is
      record
         Head     : Packet_Node_Access;
         Tail     : Packet_Node_Access;

      end record;

   type Initial_Stream_Access is access Packet_Type;
   type Params_Stream_Type
     (Initial_Size : Ada.Streams.Stream_Element_Count) is new
       Ada.Streams.Root_Stream_Type with
       record
          Initial : Initial_Stream_Access;
          Extra   : Packet_List_Type;
       end record;
   --  Two kinds of storage in a stream :
   --   o an initial storage initialized during the declaration
   --   o an extra storage with a linked list of fixed size packets

   --     used during execution when the initial storage is not sufficient
   procedure Head_Node
     (Index  :    out Packet_Node_Access;
      Stream : in     Params_Stream_Type);

   --  Set index to the first packet of the extra storage
   procedure Tail_Node
     (Index  :    out Packet_Node_Access;
      Stream : in     Params_Stream_Type);

   --  Set index to the last packet of the extra storage
   function Null_Node
     (Index : Packet_Node_Access)
     return Boolean;

   --  True if null
   procedure Delete_Head_Node
     (Stream : in out Params_Stream_Type);

   --  Delete the first node and free it
   procedure Next_Node
     (Node : in out Packet_Node_Access);
   --  Node is set to the next node

   --  If not possible, Stream_Error is raised
   procedure Append_New_Node
     (Stream : in out Params_Stream_Type);

   --  Create a new node at the end of the extra storage
end System.RPC;