-- File: PupEchoServerNoDisk.mesa - last edit: -- AOF 3-Feb-88 11:36:47 -- HGM 25-Jun-85 1:14:13 -- Copyright (C) 1983, 1985, 1988 by Xerox Corporation. All rights reserved. DIRECTORY Process USING [Yield], PupWireFormat USING [MesaToBcplLongNumber], PupEchoServerDefs USING [ echoStatsRequest, echoStatsReply, EchoStatsEntry, echoVersion], Stats USING [StatIncr, StatBump], PupDefs USING [ PupBuffer, PupPackageMake, PupPackageDestroy, ReturnBuffer, PupRouterSendThis, ReturnPup, SwapPupSourceAndDest, GetPupContentsBytes, PupSocket, PupSocketMake, PupSocketDestroy, PupSocketKick, veryLongWait], PupTypes USING [echoSoc, fillInPupAddress]; PupEchoServerNoDisk: PROGRAM IMPORTS Process, PupWireFormat, Stats, PupDefs EXPORTS PupEchoServerDefs = BEGIN pupsEchoed: LONG CARDINAL ← 0; useCount, hits: CARDINAL ← 0; pleaseStop, running, verbose: BOOLEAN ← FALSE; echoFork: PROCESS; echoSocket: PupDefs.PupSocket; EchoServerOn: PUBLIC PROCEDURE = BEGIN IF (useCount ← useCount + 1) = 1 THEN BEGIN running ← TRUE; Starter[]; END; END; Starter: PROCEDURE = BEGIN pleaseStop ← FALSE; [] ← PupDefs.PupPackageMake[]; echoSocket ← PupDefs.PupSocketMake[ PupTypes.echoSoc, PupTypes.fillInPupAddress, PupDefs.veryLongWait]; echoFork ← FORK Echoer[]; END; EchoServerOff: PUBLIC PROCEDURE = BEGIN IF useCount # 0 AND (useCount ← useCount - 1) = 0 THEN BEGIN running ← FALSE; Stopper[]; END; END; Stopper: PROCEDURE = BEGIN pleaseStop ← TRUE; PupDefs.PupSocketKick[echoSocket]; JOIN echoFork[]; PupDefs.PupSocketDestroy[echoSocket]; PupDefs.PupPackageDestroy[]; END; Echoer: PROCEDURE = BEGIN b: PupDefs.PupBuffer; UNTIL pleaseStop DO IF (b ← echoSocket.get[]) # NIL THEN BEGIN SELECT b.pup.pupType FROM echoMe => BEGIN pupsEchoed ← pupsEchoed + 1; Stats.StatIncr[pupsEchoed]; Stats.StatBump[pupBytesEchoed, PupDefs.GetPupContentsBytes[b]]; b.pup.pupType ← iAmEcho; PupDefs.SwapPupSourceAndDest[b]; PupDefs.PupRouterSendThis[b]; END; PupEchoServerDefs.echoStatsRequest => BEGIN OPEN PupEchoServerDefs; ese: LONG POINTER TO EchoStatsEntry ← LOOPHOLE[@b.pup.pupWords]; ese↑ ← [ version: echoVersion, pupsEchoed: PupWireFormat.MesaToBcplLongNumber[pupsEchoed] ]; PupDefs.ReturnPup[ b, PupEchoServerDefs.echoStatsReply, 2*SIZE[EchoStatsEntry]]; END; ENDCASE => PupDefs.ReturnBuffer[b]; END; Process.Yield[]; -- avoid hogging machine ENDLOOP; END; -- initialization EchoServerOn[]; END.