diff options
author | bosch <bosch@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-08 20:11:04 +0000 |
---|---|---|
committer | bosch <bosch@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-08 20:11:04 +0000 |
commit | f15731c43ae5e8cea424ea40f905c19afa1bd2e4 (patch) | |
tree | b584a79288c93215b05fb451943291ccd039388b /gcc/ada/9drpc.adb | |
parent | 1d347c236ad815c77bd345611ed221b0bd6091de (diff) | |
download | gcc-f15731c43ae5e8cea424ea40f905c19afa1bd2e4.tar.gz |
* 41intnam.ads, 42intnam.ads, 4aintnam.ads, 4cintnam.ads,
4dintnam.ads, 4gintnam.ads, 4hintnam.ads, 4lintnam.ads,
4mintnam.ads, 4pintnam.ads, 4rintnam.ads, 4sintnam.ads,
4uintnam.ads, 4vcalend.adb, 4zintnam.ads, 52system.ads,
5amastop.adb, 5asystem.ads, 5ataprop.adb, 5atpopsp.adb,
5avxwork.ads, 5bosinte.adb, 5bsystem.ads, 5esystem.ads,
5fsystem.ads, 5ftaprop.adb, 5ginterr.adb, 5gmastop.adb,
5gsystem.ads, 5gtaprop.adb, 5gtasinf.adb, 5gtasinf.ads,
5hparame.ads, 5hsystem.ads, 5htaprop.adb, 5htraceb.adb,
5itaprop.adb, 5ksystem.ads, 5kvxwork.ads, 5lintman.adb,
5lsystem.ads, 5mvxwork.ads, 5ninmaop.adb, 5nosinte.ads,
5ntaprop.adb, 5ointerr.adb, 5omastop.adb, 5oosinte.adb,
5osystem.ads, 5otaprop.adb, 5otaspri.ads, 5pvxwork.ads,
5qtaprop.adb, 5sintman.adb, 5ssystem.ads, 5staprop.adb,
5stpopse.adb, 5svxwork.ads, 5tosinte.ads, 5uintman.adb,
5vasthan.adb, 5vinmaop.adb, 5vinterr.adb, 5vintman.adb,
5vmastop.adb, 5vparame.ads, 5vsystem.ads, 5vtaprop.adb,
5vtpopde.adb, 5wmemory.adb, 5wsystem.ads, 5wtaprop.adb,
5ysystem.ads, 5zinterr.adb, 5zintman.adb, 5zosinte.adb,
5zosinte.ads, 5zsystem.ads, 5ztaprop.adb, 6vcpp.adb, 6vcstrea.adb,
7sintman.adb, 7staprop.adb, 7stpopsp.adb, 9drpc.adb,
Make-lang.in, Makefile.in, a-caldel.adb, a-comlin.ads,
a-dynpri.adb, a-except.adb, a-except.ads, a-finali.adb,
a-ncelfu.ads, a-reatim.adb, a-retide.adb, a-stream.ads,
a-ststio.adb, a-ststio.ads, a-stwifi.adb, a-tags.adb, a-tasatt.adb,
a-textio.adb, a-tideau.adb, a-tiflau.adb, a-tigeau.adb,
a-tigeau.ads, a-tiinau.adb, a-timoau.adb, a-witeio.adb,
a-wtdeau.adb, a-wtenau.adb, a-wtflau.adb, a-wtgeau.adb,
a-wtgeau.ads, a-wtinau.adb, a-wtmoau.adb, ada-tree.def, ada-tree.h,
adaint.c, adaint.h, ali-util.adb, ali.adb, ali.ads, atree.adb,
atree.ads, atree.h, back_end.adb, bcheck.adb, bindgen.adb,
bindusg.adb, checks.adb, comperr.adb, config-lang.in, csets.adb,
csets.ads, cstand.adb, cstreams.c, debug.adb, debug.ads, decl.c,
einfo.adb, einfo.ads, einfo.h, elists.h, errout.adb, errout.ads,
eval_fat.adb, exp_aggr.adb, exp_attr.adb, exp_ch11.adb,
exp_ch12.adb, exp_ch13.adb, exp_ch2.adb, exp_ch3.adb, exp_ch3.ads,
exp_ch4.adb, exp_ch5.adb, exp_ch6.adb, exp_ch7.adb, exp_ch7.ads,
exp_ch9.adb, exp_ch9.ads, exp_dbug.adb, exp_dbug.ads, exp_disp.ads,
exp_dist.adb, exp_fixd.adb, exp_intr.adb, exp_pakd.adb,
exp_prag.adb, exp_strm.adb, exp_util.adb, exp_util.ads,
expander.adb, expect.c, fe.h, fmap.adb, fmap.ads, fname-uf.adb,
freeze.adb, frontend.adb, g-awk.adb, g-cgideb.adb, g-comlin.adb,
g-comlin.ads, g-debpoo.adb, g-dirope.adb, g-dirope.ads,
g-dyntab.adb, g-expect.adb, g-expect.ads, g-io.ads, g-io_aux.adb,
g-io_aux.ads, g-locfil.adb, g-locfil.ads, g-os_lib.adb,
g-os_lib.ads, g-regexp.adb, g-regpat.adb, g-socket.adb,
g-socket.ads, g-spipat.adb, g-table.adb, g-trasym.adb,
g-trasym.ads, gigi.h, gmem.c, gnat1drv.adb, gnatbind.adb, gnatbl.c,
gnatchop.adb, gnatcmd.adb, gnatdll.adb, gnatfind.adb, gnatlbr.adb,
gnatlink.adb, gnatls.adb, gnatmem.adb, gnatprep.adb, gnatvsn.ads,
gnatxref.adb, hlo.adb, hostparm.ads, i-cobol.adb, i-cpp.adb,
i-cstrea.ads, i-cstrin.adb, i-pacdec.adb, i-vxwork.ads,
impunit.adb, init.c, inline.adb, io-aux.c, layout.adb, lib-load.adb,
lib-util.adb, lib-writ.adb, lib-writ.ads, lib-xref.adb,
lib-xref.ads, lib.adb, lib.ads, make.adb, makeusg.adb, mdll.adb,
memroot.adb, misc.c, mlib-tgt.adb, mlib-utl.adb, mlib-utl.ads,
mlib.adb, namet.adb, namet.ads, namet.h, nlists.h, nmake.adb,
nmake.ads, nmake.adt, opt.adb, opt.ads, osint.adb, osint.ads,
output.adb, output.ads, par-ch2.adb, par-ch3.adb, par-ch5.adb,
par-prag.adb, par-tchk.adb, par-util.adb, par.adb, prj-attr.adb,
prj-dect.adb, prj-env.adb, prj-env.ads, prj-nmsc.adb, prj-part.adb,
prj-proc.adb, prj-strt.adb, prj-tree.adb, prj-tree.ads, prj.adb,
prj.ads, raise.c, raise.h, repinfo.adb, restrict.adb, restrict.ads,
rident.ads, rtsfind.adb, rtsfind.ads, s-arit64.adb, s-asthan.adb,
s-atacco.adb, s-atacco.ads, s-auxdec.adb, s-crc32.adb, s-crc32.ads,
s-direio.adb, s-fatgen.adb, s-fileio.adb, s-finimp.adb,
s-gloloc.adb, s-gloloc.ads, s-interr.adb, s-mastop.adb,
s-mastop.ads, s-memory.adb, s-parame.ads, s-parint.adb,
s-pooglo.adb, s-pooloc.adb, s-rpc.adb, s-secsta.adb, s-sequio.adb,
s-shasto.adb, s-soflin.adb, s-soflin.ads, s-stache.adb,
s-taasde.adb, s-taasde.ads, s-tadeca.adb, s-tadeca.ads,
s-tadert.adb, s-tadert.ads, s-taenca.adb, s-taenca.ads,
s-taprob.adb, s-taprop.ads, s-tarest.adb, s-tasdeb.adb,
s-tasini.adb, s-tasini.ads, s-taskin.adb, s-taskin.ads,
s-tasque.adb, s-tasque.ads, s-tasren.adb, s-tasren.ads,
s-tassta.adb, s-tasuti.adb, s-tasuti.ads, s-tataat.adb,
s-tataat.ads, s-tpoben.adb, s-tpoben.ads, s-tpobop.adb,
s-tposen.adb, s-tposen.ads, s-traceb.adb, s-traceb.ads,
s-unstyp.ads, s-widenu.adb, scn-nlit.adb, scn.adb, sem.adb,
sem_aggr.adb, sem_attr.adb, sem_attr.ads, sem_case.adb,
sem_ch10.adb, sem_ch11.adb, sem_ch11.ads, sem_ch12.adb,
sem_ch13.adb, sem_ch13.ads, sem_ch2.adb, sem_ch3.adb, sem_ch3.ads,
sem_ch4.adb, sem_ch5.adb, sem_ch6.adb, sem_ch6.ads, sem_ch7.adb,
sem_ch8.adb, sem_ch8.ads, sem_ch9.adb, sem_disp.adb, sem_dist.adb,
sem_elab.adb, sem_elim.adb, sem_elim.ads, sem_eval.adb,
sem_intr.adb, sem_mech.adb, sem_prag.adb, sem_res.adb,
sem_type.adb, sem_util.adb, sem_util.ads, sem_vfpt.adb,
sem_warn.adb, sinfo.adb, sinfo.ads, sinfo.h, sinput-l.adb,
sinput-l.ads, sinput.adb, sinput.ads, snames.adb, snames.ads,
snames.h, sprint.adb, sprint.ads, stringt.adb, stringt.ads,
stringt.h, style.adb, switch.adb, switch.ads, sysdep.c, system.ads,
table.adb, targparm.adb, targparm.ads, targtyps.c, tbuild.adb,
tbuild.ads, tracebak.c, trans.c, tree_gen.adb, tree_io.adb,
treepr.adb, treepr.ads, treeprs.ads, treeprs.adt, ttypes.ads,
types.adb, types.ads, types.h, uintp.ads, urealp.ads, usage.adb,
utils.c, utils2.c, validsw.adb, xnmake.adb, xr_tabls.adb,
xr_tabls.ads, xref_lib.adb, xref_lib.ads : Merge in ACT changes.
* 1ssecsta.adb, 1ssecsta.ads, a-chlat9.ads, a-cwila9.ads,
g-enblsp.adb, g-md5.adb, g-md5.ads, gnatname.adb, gnatname.ads,
mkdir.c, osint-b.adb, osint-b.ads, osint-c.adb, osint-c.ads,
osint-l.adb, osint-l.ads, osint-m.adb, osint-m.ads : New files
* 3lsoccon.ads, 5qparame.ads, 5qvxwork.ads, 5smastop.adb,
5zparame.ads, gnatmain.adb, gnatmain.ads, gnatpsys.adb : Removed
* mdllfile.adb, mdllfile.ads, mdlltool.adb, mdlltool.ads : Renamed
to mdll-fil.ad[bs] and mdll-util.ad[bs]
* mdll-fil.adb, mdll-fil.ads, mdll-utl.adb, mdll-utl.ads : Renamed
from mdllfile.ad[bs] and mdlltool.ad[bs]
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50451 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/9drpc.adb')
-rw-r--r-- | gcc/ada/9drpc.adb | 302 |
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"); |