RPCBulk.mesa
Andrew Birrell 26-Feb-82 10:06:00
DIRECTORY
NameInfoSpecialDefs, Process, MesaRPC, RPCLupine, Runtime, SpyClient, System;
RPCBulk: MONITOR
IMPORTS NameInfoSpecialDefs, Process, MesaRPC, RPCLupine, Runtime, SpyClient, System =
BEGIN
-- ******** Test program ******** --
Finished: SIGNAL = CODE;
signalFinished: BOOLEANTRUE;
tries: CARDINAL ← 1000;
quit: BOOLEANFALSE;
gvExport: BOOLEANTRUE;
gvInstance: STRING = "RPCRuntime.pa";
nongvInstance: STRING = "Tokay";
callerName: MesaRPC.Principal ← "Test.pa";
callerKey: MesaRPC.EncryptionKey ← MesaRPC.MakeKey["Test"L];
exporterName: MesaRPC.Principal ← "RPCRuntime.pa";
exporterKey: MesaRPC.EncryptionKey ← MesaRPC.MakeKey["zzy"L];
userTest: BOOLEANTRUE;
spyWanted: BOOLEANFALSE;
import: RPCLupine.ImportHandle ← NIL;
-- Test version of stub code --
StartTransfer: PROC[conv: MesaRPC.Conversation] =
BEGIN
pktSpace: ARRAY[1..RPCLupine.pktOverhead+1] OF WORD;
pkt: RPCLupine.StubPkt = RPCLupine.GetStubPkt[@pktSpace];
[] ← RPCLupine.StartCall[pkt, import, conv];
BEGIN
length: RPCLupine.DataLength;
last: BOOLEAN;
pkt[0] ← 1;
[length, last] ← RPCLupine.Call[pkt, 1, 1, NIL];
IF NOT last THEN ERROR;
END;
END;
SendPage: PROC[conv: MesaRPC.Conversation, page: CARDINAL] =
BEGIN
pktSpace: ARRAY[1..RPCLupine.pktOverhead+RPCLupine.maxDataLength] OF WORD;
pkt: RPCLupine.StubPkt = RPCLupine.GetStubPkt[@pktSpace];
[] ← RPCLupine.StartCall[pkt, import, conv];
BEGIN
length: RPCLupine.DataLength;
last: BOOLEAN;
pkt[0] ← 0; pkt[1] ← page;
[length, last] ← RPCLupine.Call[pkt, RPCLupine.maxDataLength,
RPCLupine.maxDataLength, NIL];
IF NOT last THEN ERROR;
END;
END;
TestDispatcher: RPCLupine.Dispatcher =
BEGIN
-- Dummy dispatcher: consumes args and sends dummy result --
IF NOT lastPkt THEN ERROR;
SELECT pkt[0] FROM
0 => AcceptPage[localConversation, pkt[1] ];
1 => AcceptTransfer[localConversation];
ENDCASE => ERROR;
RETURN[0];
END;
-- Test version of client code --
-- Sender --
conversation: MesaRPC.Conversation;
senderPage: CARDINAL ← 0;
NextPage: ENTRY PROC RETURNS[p: CARDINAL] = INLINE
{ p ← senderPage; senderPage ← senderPage+1 };
Sender: PROC[limit: CARDINAL] =
BEGIN
DO p: CARDINAL = NextPage[];
IF p > limit THEN EXIT;
SendPage[conversation, p];
ENDLOOP;
END;
-- Receiver --
pageCond: CONDITION ← [timeout:0];
receiverPage: CARDINAL ← 0;
AcceptTransfer: ENTRY PROC[conv: MesaRPC.Conversation] =
BEGIN
receiverPage ← 0;
END;
AcceptPage: ENTRY PROC[conv: MesaRPC.Conversation, page: CARDINAL] =
BEGIN
UNTIL receiverPage = page DO WAIT pageCond ENDLOOP;
receiverPage ← page + 1;
BROADCAST pageCond;
END;
DoIt: PROC =
BEGIN
-- Export and import --
instance: STRINGIF gvExport THEN gvInstance ELSE nongvInstance;
import ← RPCLupine.ImportInterface[["RPC-bulk-test"L, instance], [0,0] !
MesaRPC.ImportFailed =>
IF why = unbound OR why = communications
THEN BEGIN
[] ← RPCLupine.ExportInterface[exporterName, exporterKey,
["RPC-bulk-test"L, instance], TestDispatcher, [0,0]];
import ← RPCLupine.ImportInterface[["RPC-bulk-test"L,
instance],[0,0]];
CONTINUE
END ];
BEGIN
spyAvailable: BOOLEAN = Runtime.IsBound[SpyClient.StartCounting];
UNTIL quit
DO UNTIL userTest DO Process.Pause[Process.SecondsToTicks[5]] ENDLOOP;
conversation ← MesaRPC.StartConversation[callerName, callerKey, exporterName, authOnly];
senderPage ← 0; StartTransfer[conversation];
NameInfoSpecialDefs.CleanUp[];
IF spyWanted AND spyAvailable THEN SpyClient.StartCounting[];
BEGIN
start: System.Pulses = System.GetClockPulses[];
end: System.Pulses;
elapsed: System.Microseconds;
first: PROCESS = FORK Sender[tries];
second: PROCESS = FORK Sender[tries];
third: PROCESS = FORK Sender[tries];
fourth: PROCESS = FORK Sender[tries];
fifth: PROCESS = FORK Sender[tries];
sixth: PROCESS = FORK Sender[tries];
seventh: PROCESS = FORK Sender[tries];
JOIN first; JOIN second; JOIN third; JOIN fourth;
JOIN fifth; JOIN sixth; JOIN seventh;
end ← System.GetClockPulses[];
IF spyWanted AND spyAvailable THEN SpyClient.StopCounting[];
elapsed ← System.PulsesToMicroseconds[[end-start]];
MesaRPC.EndConversation[conversation];
IF signalFinished THEN SIGNAL Finished[];
END;
ENDLOOP;
END;
END;
DoIt[];
END.