summaryrefslogtreecommitdiff
path: root/gcc/ada/9drpc.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/9drpc.adb')
-rw-r--r--gcc/ada/9drpc.adb302
1 files changed, 152 insertions, 150 deletions
diff --git a/gcc/ada/9drpc.adb b/gcc/ada/9drpc.adb
index 4f9d314d000..8edba9e46fb 100644
--- a/gcc/ada/9drpc.adb
+++ b/gcc/ada/9drpc.adb
@@ -6,9 +6,9 @@
-- --
-- B o d y --
-- --
--- $Revision: 1.1 $ --
+-- $Revision$
-- --
--- Copyright (C) 1992,1993,1994,1995 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2001 Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -33,6 +33,8 @@
-- --
------------------------------------------------------------------------------
+-- Version for ???
+
with Unchecked_Deallocation;
with Ada.Streams;
@@ -43,6 +45,10 @@ pragma Elaborate (System.RPC.Garlic);
package body System.RPC is
+ -- ??? general note: the debugging calls are very heavy, especially
+ -- those that create exception handlers in every procedure. Do we
+ -- really still need all this stuff?
+
use type Ada.Streams.Stream_Element_Count;
use type Ada.Streams.Stream_Element_Offset;
@@ -52,7 +58,7 @@ package body System.RPC is
Max_Of_Message_Id : constant := 127;
subtype Message_Id_Type is
- Integer range -Max_Of_Message_Id .. Max_Of_Message_Id;
+ Integer range -Max_Of_Message_Id .. Max_Of_Message_Id;
-- A message id is either a request id or reply id. A message id is
-- provided with a message to a receiving stub which uses the opposite
-- as a reply id. A message id helps to retrieve to which task is
@@ -67,9 +73,9 @@ package body System.RPC is
type Message_Length_Per_Request is array (Request_Id_Type)
of Ada.Streams.Stream_Element_Count;
- Header_Size : Ada.Streams.Stream_Element_Count
- := Streams.Get_Integer_Initial_Size +
- Streams.Get_SEC_Initial_Size;
+ Header_Size : Ada.Streams.Stream_Element_Count :=
+ Streams.Get_Integer_Initial_Size +
+ Streams.Get_SEC_Initial_Size;
-- Initial size needed for frequently used header streams
Stream_Error : exception;
@@ -94,33 +100,30 @@ package body System.RPC is
Params_Size : in Ada.Streams.Stream_Element_Count;
Result_Size : in Ada.Streams.Stream_Element_Count;
Protocol : in Garlic.Protocol_Access);
- -- This entry provides an anonymous task a remote call to perform
- -- This task calls for a
- -- Request id is provided to construct the reply id by using
- -- -Request. Partition is used to send the reply message. Params_Size
- -- is the size of the calling stub Params stream. Then, Protocol
- -- (used by the environment task previously) allows to extract the
- -- message following the header (The header is extracted by the
- -- environment task)
+ -- This entry provides an anonymous task a remote call to perform.
+ -- This task calls for a Request id is provided to construct the
+ -- reply id by using -Request. Partition is used to send the reply
+ -- message. Params_Size is the size of the calling stub Params stream.
+ -- Then Protocol (used by the environment task previously) allows
+ -- extraction of the message following the header (The header is
+ -- extracted by the environment task)
+ -- Note: grammar in above is obscure??? needs cleanup
end Anonymous_Task_Type;
type Anonymous_Task_Access is access Anonymous_Task_Type;
- type Anonymous_Task_List is
- record
- Head : Anonymous_Task_Node_Access;
- Tail : Anonymous_Task_Node_Access;
- end record;
-
- type Anonymous_Task_Node is
- record
- Element : Anonymous_Task_Access;
- Next : Anonymous_Task_Node_Access;
- end record;
- -- Types we need to construct a singly linked list of anonymous tasks
- -- This pool is maintained to avoid a task creation each time a RPC
- -- occurs
+ type Anonymous_Task_List is record
+ Head : Anonymous_Task_Node_Access;
+ Tail : Anonymous_Task_Node_Access;
+ end record;
+
+ type Anonymous_Task_Node is record
+ Element : Anonymous_Task_Access;
+ Next : Anonymous_Task_Node_Access;
+ end record;
+ -- Types we need to construct a singly linked list of anonymous tasks.
+ -- This pool is maintained to avoid a task creation each time a RPC occurs.
protected Garbage_Collector is
@@ -133,6 +136,7 @@ package body System.RPC is
(Item : in out Anonymous_Task_Node_Access);
-- Anonymous task pool management : queue this task in the pool
-- of inactive anonymous tasks.
+
private
Anonymous_List : Anonymous_Task_Node_Access;
@@ -230,13 +234,16 @@ package body System.RPC is
---------------
procedure Head_Node
- (Index : out Packet_Node_Access;
- Stream : in Params_Stream_Type) is
+ (Index : out Packet_Node_Access;
+ Stream : Params_Stream_Type)
+ is
begin
Index := Stream.Extra.Head;
- exception when others =>
- D (D_Exception, "exception in Head_Node");
- raise;
+
+ exception
+ when others =>
+ D (D_Exception, "exception in Head_Node");
+ raise;
end Head_Node;
---------------
@@ -244,34 +251,37 @@ package body System.RPC is
---------------
procedure Tail_Node
- (Index : out Packet_Node_Access;
- Stream : in Params_Stream_Type) is
+ (Index : out Packet_Node_Access;
+ Stream : Params_Stream_Type)
+ is
begin
Index := Stream.Extra.Tail;
- exception when others =>
- D (D_Exception, "exception in Tail_Node");
- raise;
+
+ exception
+ when others =>
+ D (D_Exception, "exception in Tail_Node");
+ raise;
end Tail_Node;
---------------
-- Null_Node --
---------------
- function Null_Node
- (Index : in Packet_Node_Access) return Boolean is
+ function Null_Node (Index : in Packet_Node_Access) return Boolean is
begin
return Index = null;
- exception when others =>
- D (D_Exception, "exception in Null_Node");
- raise;
+
+ exception
+ when others =>
+ D (D_Exception, "exception in Null_Node");
+ raise;
end Null_Node;
----------------------
-- Delete_Head_Node --
----------------------
- procedure Delete_Head_Node
- (Stream : in out Params_Stream_Type) is
+ procedure Delete_Head_Node (Stream : in out Params_Stream_Type) is
procedure Free is
new Unchecked_Deallocation
@@ -280,7 +290,6 @@ package body System.RPC is
Next_Node : Packet_Node_Access := Stream.Extra.Head.Next;
begin
-
-- Delete head node and free memory usage
Free (Stream.Extra.Head);
@@ -292,19 +301,18 @@ package body System.RPC is
Stream.Extra.Tail := null;
end if;
- exception when others =>
- D (D_Exception, "exception in Delete_Head_Node");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Delete_Head_Node");
+ raise;
end Delete_Head_Node;
---------------
-- Next_Node --
---------------
- procedure Next_Node
- (Node : in out Packet_Node_Access) is
+ procedure Next_Node (Node : in out Packet_Node_Access) is
begin
-
-- Node is set to the next node
-- If not possible, Stream_Error is raised
@@ -314,20 +322,20 @@ package body System.RPC is
Node := Node.Next;
end if;
- exception when others =>
- D (D_Exception, "exception in Next_Node");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Next_Node");
+ raise;
end Next_Node;
---------------------
-- Append_New_Node --
---------------------
- procedure Append_New_Node
- (Stream : in out Params_Stream_Type) is
+ procedure Append_New_Node (Stream : in out Params_Stream_Type) is
Index : Packet_Node_Access;
- begin
+ begin
-- Set Index to the end of the linked list
Tail_Node (Index, Stream);
@@ -340,7 +348,6 @@ package body System.RPC is
Stream.Extra.Tail := Stream.Extra.Head;
else
-
-- The list is not empty : link new node with tail
Stream.Extra.Tail.Next := new Packet_Node;
@@ -348,9 +355,10 @@ package body System.RPC is
end if;
- exception when others =>
- D (D_Exception, "exception in Append_New_Node");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Append_New_Node");
+ raise;
end Append_New_Node;
----------
@@ -360,8 +368,8 @@ package body System.RPC is
procedure Read
(Stream : in out Params_Stream_Type;
Item : out Ada.Streams.Stream_Element_Array;
- Last : out Ada.Streams.Stream_Element_Offset) renames
- System.RPC.Streams.Read;
+ Last : out Ada.Streams.Stream_Element_Offset)
+ renames System.RPC.Streams.Read;
-----------
-- Write --
@@ -369,8 +377,8 @@ package body System.RPC is
procedure Write
(Stream : in out Params_Stream_Type;
- Item : in Ada.Streams.Stream_Element_Array) renames
- System.RPC.Streams.Write;
+ Item : in Ada.Streams.Stream_Element_Array)
+ renames System.RPC.Streams.Write;
-----------------------
-- Garbage_Collector --
@@ -382,12 +390,11 @@ package body System.RPC is
-- Garbage_Collector.Allocate --
--------------------------------
- procedure Allocate
- (Item : out Anonymous_Task_Node_Access) is
+ procedure Allocate (Item : out Anonymous_Task_Node_Access) is
New_Anonymous_Task_Node : Anonymous_Task_Node_Access;
Anonymous_Task : Anonymous_Task_Access;
- begin
+ begin
-- If the list is empty, allocate a new anonymous task
-- Otherwise, reuse the first queued anonymous task
@@ -404,7 +411,6 @@ package body System.RPC is
New_Anonymous_Task_Node.all := (Anonymous_Task, null);
else
-
-- Extract one task from the list
-- Set the Next field to null to avoid possible bugs
@@ -418,27 +424,27 @@ package body System.RPC is
Item := New_Anonymous_Task_Node;
- exception when others =>
- D (D_Exception, "exception in Allocate (Anonymous Task)");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Allocate (Anonymous Task)");
+ raise;
end Allocate;
----------------------------------
-- Garbage_Collector.Deallocate --
----------------------------------
- procedure Deallocate
- (Item : in out Anonymous_Task_Node_Access) is
+ procedure Deallocate (Item : in out Anonymous_Task_Node_Access) is
begin
-
-- Enqueue the task in the free list
Item.Next := Anonymous_List;
Anonymous_List := Item;
- exception when others =>
- D (D_Exception, "exception in Deallocate (Anonymous Task)");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Deallocate (Anonymous Task)");
+ raise;
end Deallocate;
end Garbage_Collector;
@@ -448,15 +454,16 @@ package body System.RPC is
------------
procedure Do_RPC
- (Partition : in Partition_ID;
+ (Partition : Partition_ID;
Params : access Params_Stream_Type;
- Result : access Params_Stream_Type) is
+ Result : access Params_Stream_Type)
+ is
Protocol : Protocol_Access;
Request : Request_Id_Type;
Header : aliased Params_Stream_Type (Header_Size);
R_Length : Ada.Streams.Stream_Element_Count;
- begin
+ begin
-- Parameters order :
-- Opcode (provided and used by garlic)
-- (1) Size (provided by s-rpc and used by garlic)
@@ -538,7 +545,6 @@ package body System.RPC is
declare
New_Result : aliased Params_Stream_Type (R_Length);
begin
-
-- Adjust the Result stream size right now to be able to load
-- the stream in one receive call. Create a temporary resutl
-- that will be substituted to Do_RPC one
@@ -570,7 +576,6 @@ package body System.RPC is
end;
else
-
-- Do RPC locally and first wait for Partition_RPC_Receiver to be
-- set
@@ -580,9 +585,10 @@ package body System.RPC is
end if;
- exception when others =>
- D (D_Exception, "exception in Do_RPC");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Do_RPC");
+ raise;
end Do_RPC;
------------
@@ -590,13 +596,14 @@ package body System.RPC is
------------
procedure Do_APC
- (Partition : in Partition_ID;
- Params : access Params_Stream_Type) is
+ (Partition : Partition_ID;
+ Params : access Params_Stream_Type)
+ is
Message_Id : Message_Id_Type := 0;
Protocol : Protocol_Access;
Header : aliased Params_Stream_Type (Header_Size);
- begin
+ begin
-- For more informations, see above
-- Request = 0 as we are not waiting for a reply message
-- Result length = 0 as we don't expect a result at all
@@ -660,7 +667,6 @@ package body System.RPC is
declare
Result : aliased Params_Stream_Type (0);
begin
-
-- Result is here a dummy parameter
-- No reason to deallocate as it is not allocated at all
@@ -672,29 +678,31 @@ package body System.RPC is
end if;
- exception when others =>
- D (D_Exception, "exception in Do_APC");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Do_APC");
+ raise;
end Do_APC;
----------------------------
-- Establish_RPC_Receiver --
----------------------------
- procedure Establish_RPC_Receiver (
- Partition : in Partition_ID;
- Receiver : in RPC_Receiver) is
+ procedure Establish_RPC_Receiver
+ (Partition : in Partition_ID;
+ Receiver : in RPC_Receiver)
+ is
begin
-
-- Set Partition_RPC_Receiver and allow RPC mechanism
Partition_RPC_Receiver := Receiver;
Partition_Receiver.Set;
D (D_Elaborate, "Partition_Receiver is set");
- exception when others =>
- D (D_Exception, "exception in Establish_RPC_Receiver");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Establish_RPC_Receiver");
+ raise;
end Establish_RPC_Receiver;
----------------
@@ -705,24 +713,24 @@ package body System.RPC is
Last_Request : Request_Id_Type := Request_Id_Type'First;
Current_Rqst : Request_Id_Type := Request_Id_Type'First;
Current_Size : Ada.Streams.Stream_Element_Count;
- begin
+ begin
loop
+ -- Three services:
- -- Three services :
- -- New_Request to get an entry in Dispatcher table
- -- Wait_On for Do_RPC calls
- -- Wake_Up called by environment task when a Do_RPC receives
- -- the result of its remote call
+ -- New_Request to get an entry in Dispatcher table
- select
+ -- Wait_On for Do_RPC calls
+
+ -- Wake_Up called by environment task when a Do_RPC receives
+ -- the result of its remote call
- accept New_Request
- (Request : out Request_Id_Type) do
+ select
+ accept New_Request (Request : out Request_Id_Type) do
Request := Last_Request;
-- << TODO >>
- -- Avaibility check
+ -- ??? Avaibility check
if Last_Request = Request_Id_Type'Last then
Last_Request := Request_Id_Type'First;
@@ -733,11 +741,10 @@ package body System.RPC is
end New_Request;
or
-
accept Wake_Up
- (Request : in Request_Id_Type;
- Length : in Ada.Streams.Stream_Element_Count) do
-
+ (Request : Request_Id_Type;
+ Length : Ada.Streams.Stream_Element_Count)
+ do
-- The environment reads the header and has been notified
-- of the reply id and the size of the result message
@@ -747,17 +754,17 @@ package body System.RPC is
end Wake_Up;
-- << TODO >>
- -- Must be select with delay for aborted tasks
+ -- ??? Must be select with delay for aborted tasks
select
accept Wait_On (Current_Rqst)
- (Length : out Ada.Streams.Stream_Element_Count) do
+ (Length : out Ada.Streams.Stream_Element_Count)
+ do
Length := Current_Size;
end Wait_On;
or
-
-- To free the Dispatcher when a task is aborted
delay 1.0;
@@ -765,16 +772,15 @@ package body System.RPC is
end select;
or
-
terminate;
-
end select;
end loop;
- exception when others =>
- D (D_Exception, "exception in Dispatcher body");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Dispatcher body");
+ raise;
end Dispatcher;
-------------------------
@@ -788,10 +794,9 @@ package body System.RPC is
Params_S : Ada.Streams.Stream_Element_Count; -- Params message size
Result_S : Ada.Streams.Stream_Element_Count; -- Result message size
C_Protocol : Protocol_Access; -- Current Protocol
- begin
+ begin
loop
-
-- Get a new RPC to execute
select
@@ -800,7 +805,8 @@ package body System.RPC is
Partition : in Partition_ID;
Params_Size : in Ada.Streams.Stream_Element_Count;
Result_Size : in Ada.Streams.Stream_Element_Count;
- Protocol : in Protocol_Access) do
+ Protocol : in Protocol_Access)
+ do
C_Message_Id := Message_Id;
C_Partition := Partition;
Params_S := Params_Size;
@@ -812,11 +818,11 @@ package body System.RPC is
end select;
declare
- Params : aliased Params_Stream_Type (Params_S);
- Result : aliased Params_Stream_Type (Result_S);
- Header : aliased Params_Stream_Type (Header_Size);
- begin
+ Params : aliased Params_Stream_Type (Params_S);
+ Result : aliased Params_Stream_Type (Result_S);
+ Header : aliased Params_Stream_Type (Header_Size);
+ begin
-- We reconstruct all the client context : Params and Result
-- with the SAME size, then we receive Params from calling stub
@@ -863,7 +869,6 @@ package body System.RPC is
(Header'Access,
Streams.Get_Stream_Size (Result'Access));
-
-- Get a protocol method to comunicate with the remote
-- partition and give the message size
@@ -903,12 +908,10 @@ package body System.RPC is
(C_Protocol.all,
C_Partition);
Streams.Deallocate (Header);
-
end if;
Streams.Deallocate (Params);
Streams.Deallocate (Result);
-
end;
-- Enqueue into the anonymous task free list : become inactive
@@ -917,9 +920,10 @@ package body System.RPC is
end loop;
- exception when others =>
- D (D_Exception, "exception in Anonymous_Task_Type body");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Anonymous_Task_Type body");
+ raise;
end Anonymous_Task_Type;
-----------------
@@ -934,15 +938,14 @@ package body System.RPC is
Header : aliased Params_Stream_Type (Header_Size);
Protocol : Protocol_Access;
Anonymous : Anonymous_Task_Node_Access;
- begin
+ begin
-- Wait the Partition_RPC_Receiver to be set
accept Start;
D (D_Elaborate, "Environment task elaborated");
loop
-
-- We receive first a fixed size message : the header
-- Header = Message Id + Message Size
@@ -952,10 +955,10 @@ package body System.RPC is
-- protocol to use to communicate with the calling partition
Garlic.Initiate_Receive
- (Partition,
- Message_Size,
- Protocol,
- Garlic.Remote_Call);
+ (Partition,
+ Message_Size,
+ Protocol,
+ Garlic.Remote_Call);
D (D_Communication,
"Environment task - Receive protocol to talk to active partition" &
Partition_ID'Image (Partition));
@@ -968,9 +971,9 @@ package body System.RPC is
"Environment task - Receive Header from partition" &
Partition_ID'Image (Partition));
Garlic.Receive
- (Protocol.all,
- Partition,
- Header'Access);
+ (Protocol.all,
+ Partition,
+ Header'Access);
-- Evaluate the remaining size of the message
@@ -1001,7 +1004,6 @@ package body System.RPC is
Dispatcher.Wake_Up (-Message_Id, Result_Size);
else
-
-- The message was send by a calling stub : get an anonymous
-- task to perform the job
@@ -1027,13 +1029,13 @@ package body System.RPC is
end loop;
- exception when others =>
- D (D_Exception, "exception in Environment");
- raise;
+ exception
+ when others =>
+ D (D_Exception, "exception in Environment");
+ raise;
end Environnement;
begin
-
-- Set debugging information
Debugging.Set_Environment_Variable ("RPC");