-- File: PupSockets.mesa, Last Edit: HGM October 16, 1979 9:33 PM -- Copyright Xerox Corporation 1979, 1980 -- This module does everything connected with an instance of a PupSocket. (Which isn't very much.) For now, there is no need to get fancy, so we create a new copy of this module for each PupSocket that we make, and UnNew it when we are through with it. A cache of the last few might speed things up if that ever becomes interesting. We could also use ourself as the first PupSocket to save a few words of core. DIRECTORY CommUtilDefs: FROM "CommUtilDefs" USING [ GlobalFrame, UnNew, SetTimeout, GetReturnFrame], PupRouterDefs: FROM "PupRouterDefs" USING [ PupRouterForgetAboutSocket, PupRouterKnowAboutSocket, routerLock, PupRouterSocketObject], PupDefs: FROM "PupDefs" USING [ GetLocalPupAddress, DequeuePup, PupAddress, PupBuffer, PupRouterSendThis, PupSocket, PupSocketID, Pair, PupSocketObject, Tocks, veryLongWait, veryShortWait], DriverDefs: FROM "DriverDefs" USING [doDebug], BufferDefs: FROM "BufferDefs", PupTypes: FROM "PupTypes"; PupSockets: MONITOR LOCKS PupRouterDefs.routerLock IMPORTS CommUtilDefs, PupRouterDefs, PupDefs EXPORTS PupRouterDefs, PupDefs SHARES BufferDefs = BEGIN OPEN PupRouterDefs, PupDefs; myPupSocket: PupSocketObject _ [ -- data for the client put: Put, get: Get, setRemoteAddress: SetRemoteAddress, getLocalAddress: GetLocalAddress ]; dontWait: BOOLEAN _ FALSE; myPupRouterSocket: PupRouterSocketObject; -- For now, don't try to be fancy, just create a copy. PupSocketMake: PUBLIC PROCEDURE [ local: PupSocketID, remote: PupAddress, ticks: Tocks, id: Pair] RETURNS [PupSocket] = BEGIN him: POINTER TO FRAME[PupSockets] _ NEW PupSockets; START him; -- Do initialization code him.myPupRouterSocket.local _ GetLocalPupAddress[local,@remote]; him.myPupRouterSocket.remote _ remote; him.myPupRouterSocket.id _ id; PupRouterKnowAboutSocket[@him.myPupRouterSocket]; SELECT ticks FROM veryShortWait => dontWait _ TRUE; veryLongWait => NULL; ENDCASE => CommUtilDefs.SetTimeout[@him.myPupRouterSocket.ready,ticks]; RETURN[@him.myPupSocket]; END; PupSocketKick: PUBLIC ENTRY PROCEDURE [s: PupSocket] = BEGIN him: POINTER TO FRAME[PupSockets] _ CommUtilDefs.GlobalFrame[s.put]; NOTIFY him.myPupRouterSocket.ready; END; PupSocketDestroy: PUBLIC PROCEDURE [s: PupSocket] = BEGIN him: POINTER TO FRAME[PupSockets] _ CommUtilDefs.GlobalFrame[s.put]; PupRouterForgetAboutSocket[@him.myPupRouterSocket]; CommUtilDefs.UnNew[him]; END; Get: ENTRY PROCEDURE RETURNS [b: PupBuffer] = BEGIN IF ~dontWait AND myPupRouterSocket.input.length=0 THEN BEGIN ENABLE UNWIND => NULL; -- we might get aborted WAIT myPupRouterSocket.ready; END; IF myPupRouterSocket.input.length=0 THEN RETURN[NIL]; b _ PupDefs.DequeuePup[@myPupRouterSocket.input]; IF DriverDefs.doDebug AND b#NIL THEN b.debug _ CommUtilDefs.GetReturnFrame[].accesslink; END; Put: PROCEDURE [b: PupBuffer] = BEGIN b.dest _ myPupRouterSocket.remote; b.source.socket _ myPupRouterSocket.local.socket; PupRouterSendThis[b]; END; SetRemoteAddress: ENTRY PROCEDURE [a: PupAddress] = BEGIN myPupRouterSocket.remote _ a; END; GetLocalAddress: ENTRY PROCEDURE RETURNS [PupAddress] = BEGIN RETURN[myPupRouterSocket.local]; END; -- initialization END. -- of PupSockets module(2048)\70i63I9i117I10i18I5i154I9i31I290t10 18t0 450t10 156t0 1t10 70t0 57b13B20t10 67t0 13t10 9t0 112t10 17t0 9t10 33t0 8t10 17t0 24t10 17t0 86t10 13t0 4t10 15t0 6t10 12t0 78t10 5t0 39b13B169b16B207t10b3t0B53t10 34t0 88t10 17t0 22t10 17t0 60t10 17t0 112t10b3t0B48t10 17t0 29t10 17t0 47t10b16t0B19t10 13t0 14t10 17t0 10t10 1t0 10t10b15t0B27t10 10t0 21t10 17t0