DIRECTORY Basics, BasicTime, Commander, ComputeServerClient, ComputeServer, ComputeServerControl, ComputeServerDebugger, ComputeServerInternal, InterpreterToolPrivate, IO, PrincOps, PupDefs, PupErrors, PupTypes; ComputeServerActiveServicesImpl: CEDAR MONITOR IMPORTS BasicTime, ComputeServerInternal, PupErrors EXPORTS ComputeServerInternal = BEGIN STREAM: TYPE = IO.STREAM; ActiveServicesItem: TYPE = ComputeServerInternal.ActiveServicesItem; ActiveServicesListBase: PUBLIC ComputeServerInternal.ActiveServicesItem _ NIL; ActiveServicesItemObject: TYPE = ComputeServerInternal.ActiveServicesItemObject; PupListener: TYPE = REF ComputeServerInternal.PupListenerObject; AddPupAddress: PUBLIC ENTRY PROC [serverPupAddress: PupDefs.PupAddress, procHandle: ComputeServerInternal.RegisteredProcHandle, listener: PupListener] RETURNS [newItem: ActiveServicesItem] = { newItem _ NEW[ActiveServicesItemObject _ [next: ActiveServicesListBase, listenerPupAddress: serverPupAddress, listener: listener, startListenGMT: BasicTime.Now[], procHandle: procHandle, success: true]]; ActiveServicesListBase _ newItem; }; MatchPupAddress: PUBLIC ENTRY PROC [serverPupAddress: PupDefs.PupAddress, flagStarted: BOOL] RETURNS [found: BOOL, item: ActiveServicesItem] = { nowItem: ActiveServicesItem _ ActiveServicesListBase ; WHILE nowItem # NIL DO IF serverPupAddress = nowItem.listenerPupAddress THEN { IF flagStarted THEN nowItem.heardDoService _ TRUE; RETURN [TRUE, nowItem]; }; nowItem _ nowItem.next; ENDLOOP; RETURN[FALSE, NIL]; }; findDebuggerItemFromInterpreterHandle: PUBLIC ENTRY PROC [h: InterpreterToolPrivate.Handle] RETURNS [found: BOOL, item: ActiveServicesItem _ NIL] = { nowItem: ActiveServicesItem _ ActiveServicesListBase ; WHILE nowItem # NIL DO IF h = nowItem.h THEN RETURN [TRUE, nowItem]; nowItem _ nowItem.next; ENDLOOP; RETURN[FALSE, NIL]; }; KillOldUnstartedServices: PUBLIC PROC = { nowItem: ActiveServicesItem _ ActiveServicesListBase ; lastItem: ActiveServicesItem _ NIL; now: BasicTime.GMT _ BasicTime.Now[]; WHILE nowItem # NIL DO IF ~nowItem.heardDoService AND BasicTime.Period[nowItem.startListenGMT, now] > 77 THEN { IF nowItem.listener # NIL THEN ComputeServerInternal.DestroyPupListener[nowItem.listener]; nowItem.listener _ NIL; IF lastItem = NIL THEN ActiveServicesListBase _ nowItem.next ELSE lastItem.next _ nowItem.next; }; lastItem _ nowItem; nowItem _ nowItem.next; ENDLOOP; }; DeletePupAddress: PUBLIC ENTRY PROC [serverPupAddress: PupDefs.PupAddress] RETURNS [found: BOOL] = { nowItem: ActiveServicesItem _ ActiveServicesListBase ; lastItem: ActiveServicesItem _ NIL; WHILE nowItem # NIL DO IF serverPupAddress = nowItem.listenerPupAddress THEN { IF nowItem.listener # NIL THEN ComputeServerInternal.DestroyPupListener[nowItem.listener]; nowItem.listener _ NIL; IF lastItem = NIL THEN ActiveServicesListBase _ nowItem.next ELSE lastItem.next _ nowItem.next; RETURN[TRUE]; }; lastItem _ nowItem; nowItem _ nowItem.next; ENDLOOP; RETURN[FALSE]; }; END. „ComputeServerActiveServicesImpl.mesa The Compute Server side of the Summoner. MONITOR to maintain the state of the active services. Last Edited by: Bob Hagmann, May 13, 1985 3:43:48 pm PDT Copyright c 1984 by Xerox Corporation. All rights reserved. Variable Declarations Active Services List Maintence Initialization Bob Hagmann May 13, 1985 3:43:48 pm PDT changes to: DIRECTORY Κ"– "Cedar" style˜headšœ$™$Ibodyšœ*Οkœ.™_L™8Jšœ Οmœ1™<code2š ˜ M˜Mšœ˜M˜ M˜ Mšœ˜Mšœ˜M˜Mšœ˜Mšœ˜Mšœ˜Mšœ˜M˜ Mšœ˜M˜ Mšœ ˜ ——šœ!œ˜.Mšœ,˜3Mšœ˜Mšœ˜—™Mšœœœœ˜Icode˜N˜Icode1˜Ošœœ,˜DNšœœ,œ˜NNšœœ2˜POšœ œœ)˜@J˜J˜—šœ™š Πbn œœœœwœ"˜ΐMšœ œΎ˜ΛMšœ!˜!Mšœ˜—šŸœœœœ5œœ œ˜Mšœ6˜6šœ œ˜šœ/œ˜7Mšœ œœ˜2Mšœœ ˜M˜—Mšœ˜Mšœ˜—Mšœœœ˜Mšœ˜—šΟb%œœœœ$œ œœ˜•Mšœ6˜6šœ œ˜Mšœœœœ ˜-Mšœ˜Mšœ˜—Mšœœœ˜Mšœ˜—šŸ œ œ˜)Mšœ6˜6Mšœœ˜#Mšœœ˜%šœ œ˜šœœ4œ˜XMšœœœ<˜ZMšœœ˜Mšœ œœ'œ˜_M˜—Mšœ˜Mšœ˜Mšœ˜—Mšœ˜—M˜M˜š Ÿœœœœ(œ œ˜dMšœ6˜6Mšœœ˜#šœ œ˜šœ/œ˜7Mšœœœ<˜ZMšœœ˜Mšœ œœ'œ˜_Mšœœ˜ Mšœ˜—Mšœ˜Mšœ˜Mšœ˜—Mšœœ˜Mšœ˜—J˜—™N˜N˜Mšœ˜—™'Nšœ Οr ™—N™—…— ͺP