DIRECTORY Commander, ComputeServerServer, SymTab, Rope; ComputeServerServerStubImpl: CEDAR MONITOR IMPORTS Rope, SymTab EXPORTS ComputeServerServer = BEGIN ROPE: TYPE = Rope.ROPE; Registry: PUBLIC SymTab.Ref; -- registered commands, for software that has been run and did a ComputeServer.Register, are saved here realRegister: PROC [key: ROPE, version: ROPE _ NIL, proc: Commander.CommandProc, doc: ROPE _ NIL, clientData: REF ANY _ NIL] _ NIL; Register: PUBLIC ENTRY PROC [key: ROPE, version: ROPE _ NIL, proc: Commander.CommandProc, doc: ROPE _ NIL, clientData: REF ANY _ NIL] = { found: BOOL; val: REF ANY; IF key.IsEmpty[] THEN RETURN; IF realRegister # NIL THEN realRegister[key, version, proc, doc, clientData]; IF proc = NIL THEN [] _ SymTab.Delete[x: Registry, key: key] ELSE { regList: LIST OF ComputeServerServer.RegisteredProcHandle; regProc: ComputeServerServer.RegisteredProcHandle _ NEW[ComputeServerServer.RegisteredProcObject _ [version: version, service: key, commanderProcHandle: NEW[Commander.CommandProcObject _ [proc: proc, doc: doc, clientData: clientData]]]]; [found: found, val: val] _ SymTab.Fetch[x: Registry, key: key]; regList _ NARROW[val]; regList _ CONS[regProc, regList]; [] _ SymTab.Store[ x: Registry, key: key, val: regList ]; }; }; Enumerate: PUBLIC ENTRY PROC [matchProc: ComputeServerServer.EnumerateAction] RETURNS [key: ROPE, procData: LIST OF ComputeServerServer.RegisteredProcHandle] = { outerKey: ROPE; outerProcData: LIST OF ComputeServerServer.RegisteredProcHandle; EachPairProc: SymTab.EachPairAction = { outerProcData _ NARROW[val]; outerKey _ key; RETURN[matchProc[key: outerKey, procData: outerProcData]]; }; IF NOT SymTab.Pairs[x: Registry, action: EachPairProc] THEN { outerKey _ NIL; outerProcData _ NIL; }; RETURN[key: outerKey, procData: outerProcData]; }; Lookup: PUBLIC PROC [key: ROPE, version: ROPE] RETURNS [procData: ComputeServerServer.RegisteredProcHandle] = { procRef: REF ANY; found: BOOL; listOfRegisteredProc: LIST OF ComputeServerServer.RegisteredProcHandle; [found: found, val: procRef] _ SymTab.Fetch[x: Registry, key: key]; IF found AND procRef # NIL THEN { loopList: LIST OF ComputeServerServer.RegisteredProcHandle; listOfRegisteredProc _ NARROW[procRef]; FOR loopList _ listOfRegisteredProc, loopList.rest UNTIL loopList = NIL DO IF Rope.InlineIsEmpty[loopList.first.version] OR Rope.Equal[loopList.first.version, version, FALSE] THEN RETURN[loopList.first]; ENDLOOP; } ELSE procData _ NIL; }; RegisterRealRegistration: PUBLIC PROC [Register: PROC [key: ROPE, version: ROPE _ NIL, proc: Commander.CommandProc, doc: ROPE _ NIL, clientData: REF ANY _ NIL]] = { realRegister _ Register; }; Registry _ SymTab.Create[mod: 59, case: FALSE]; END. bComputeServerServerStubImpl.mesa The Compute Server side of the Summoner. Last Edited by: Bob Hagmann, May 15, 1985 7:47:33 am PDT Copyright c 1984 by Xerox Corporation. All rights reserved. Variable Declarations Command Registry Registry of the real Registration Initialization Bob Hagmann February 12, 1985 2:09:54 pm PST changes to: DoService Κή– "Cedar" style˜headšœ ™ Ibodyšœ(™(L™8Jšœ Οmœ1™<code2šΟk ˜ M˜ M˜Mšœ˜M˜——šœžœž˜*Mšžœ ˜Mšžœ˜Mšœž˜—™Icodešžœžœžœ˜N˜N˜Jšœ žœΟcg˜…J˜JšœžΟbœžœ žœžœ$žœžœžœžœžœ˜ƒ—™šΠbnœžœž  œžœ žœžœ$žœžœžœžœžœ˜‰Nšœžœ˜ Nšœžœžœ˜ Nšžœžœžœ˜Jšžœžœžœ3˜Mšžœžœžœ,žœ˜DJšœ žœžœ*˜:Jšœ4žœcžœQ˜ξJšœ?˜?Jšœ žœ˜Jšœ žœ˜!šœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ˜—J˜—Nšœ˜—N˜šΟn œžœžœžœ2žœžœ žœžœ.˜‘Nšœ žœ˜Nšœžœžœ*˜@šœ'˜'Nšœžœ˜Nšœ˜Nšžœ4˜:N˜—šžœžœ1žœ˜=Nšœ žœ˜Nšœžœ˜N˜—Nšžœ)˜/N˜—N˜š ’œžœžœžœ žœžœ9˜oNšœ žœžœ˜Nšœžœ˜ Nšœžœžœ*˜GNšœC˜Cšžœžœ žœ˜!Jšœ žœžœ*˜;Jšœžœ ˜'šžœ0žœ žœž˜JJš žœ,žœ-žœžœžœ˜Jšžœ˜—N˜—Nšžœ žœ˜N˜N˜—N˜—™!š‘’œžœž œ’œž œžœ žœžœ$žœžœžœžœžœ˜€Nšœ˜N˜——™Nšœ(žœ˜/N˜N˜Mšžœ˜—™,Nšœ Οr ™—N™—…— ¨θ