DIRECTORY Process USING [SetTimeout, DisableTimeout], PrincOpsUtils USING [GlobalFrame], CommFlags USING [doDebug], CommUtilDefs USING [EnableAborts, GetReturnFrame], PupRouterDefs USING [ PupRouterForgetAboutSocket, PupRouterKnowAboutSocket, routerLock, PupRouterSocketObject], PupDefs USING [ GetLocalPupAddress, DequeuePup, PupAddress, PupBuffer, PupRouterSendThis, PupSocket, PupSocketID, Pair, PupSocketObject, Tocks, veryLongWait, veryShortWait], BufferDefs, PupTypes; PupSockets: MONITOR LOCKS PupRouterDefs.routerLock IMPORTS Process, PrincOpsUtils, CommUtilDefs, PupRouterDefs, PupDefs EXPORTS PupRouterDefs, PupDefs SHARES BufferDefs = BEGIN OPEN PupRouterDefs, PupDefs; free: POINTER TO FRAME[PupSockets] _ LOOPHOLE[PrincOpsUtils.GlobalFrame[ PupSocketMake]]; GetInstance: ENTRY PROCEDURE RETURNS [him: POINTER TO FRAME[PupSockets]] = BEGIN IF free = NIL THEN BEGIN him _ NEW PupSockets; START him; -- Do initialization code RETURN; END; him _ free; free _ free.next; END; FreeInstance: ENTRY PROCEDURE [him: POINTER TO FRAME[PupSockets]] = BEGIN him.next _ free; free _ him; END; next: POINTER TO FRAME[PupSockets] _ NIL; myPupSocket: PupSocket = NEW[PupSocketObject _ [ -- data for the client put: Put, get: Get, setRemoteAddress: SetRemoteAddress, getLocalAddress: GetLocalAddress] ]; dontWait, kick: BOOLEAN _ FALSE; myPupRouterSocket: PupRouterSocketObject; PupSocketMake: PUBLIC SAFE PROCEDURE [ local: PupSocketID, remote: PupAddress, ticks: Tocks, id: Pair] RETURNS [PupSocket] = TRUSTED BEGIN him: POINTER TO FRAME[PupSockets] _ GetInstance[]; him.myPupRouterSocket.local _ GetLocalPupAddress[local, remote]; him.myPupRouterSocket.remote _ remote; him.myPupRouterSocket.id _ id; him.kick _ FALSE; PupRouterKnowAboutSocket[@him.myPupRouterSocket]; SELECT ticks FROM veryShortWait => dontWait _ TRUE; veryLongWait => Process.DisableTimeout[@him.myPupRouterSocket.ready]; ENDCASE => Process.SetTimeout[@him.myPupRouterSocket.ready, ticks]; CommUtilDefs.EnableAborts[@him.myPupRouterSocket.ready]; RETURN[him.myPupSocket]; END; PupSocketMakeFull: PUBLIC SAFE PROCEDURE [local, remote: PupAddress, ticks: Tocks] RETURNS [PupSocket] = TRUSTED BEGIN him: POINTER TO FRAME[PupSockets] _ GetInstance[]; him.myPupRouterSocket.local _ local; him.myPupRouterSocket.remote _ remote; him.myPupRouterSocket.id _ [0,0]; him.kick _ FALSE; PupRouterKnowAboutSocket[@him.myPupRouterSocket]; SELECT ticks FROM veryShortWait => dontWait _ TRUE; veryLongWait => Process.DisableTimeout[@him.myPupRouterSocket.ready]; ENDCASE => Process.SetTimeout[@him.myPupRouterSocket.ready, ticks]; CommUtilDefs.EnableAborts[@him.myPupRouterSocket.ready]; RETURN[him.myPupSocket]; END; PupSocketKick: PUBLIC ENTRY SAFE PROCEDURE [s: PupSocket] = TRUSTED BEGIN him: POINTER TO FRAME[PupSockets] _ LOOPHOLE[PrincOpsUtils.GlobalFrame[s.put]]; kick _ TRUE; NOTIFY him.myPupRouterSocket.ready; END; PupSocketDestroy: PUBLIC SAFE PROCEDURE [s: PupSocket] = TRUSTED BEGIN him: POINTER TO FRAME[PupSockets] _ LOOPHOLE[PrincOpsUtils.GlobalFrame[s.put]]; PupRouterForgetAboutSocket[@him.myPupRouterSocket]; FreeInstance[him]; END; Get: ENTRY SAFE PROCEDURE RETURNS [b: PupBuffer] = TRUSTED BEGIN IF ~dontWait AND myPupRouterSocket.input.length = 0 THEN BEGIN IF ~kick THEN WAIT myPupRouterSocket.ready [ ! UNWIND => NULL]; END; kick _ FALSE; IF myPupRouterSocket.input.length = 0 THEN RETURN[NIL]; b _ PupDefs.DequeuePup[myPupRouterSocket.input]; IF CommFlags.doDebug AND b # NIL THEN b.debug _ CommUtilDefs.GetReturnFrame[].accesslink; END; Put: PROCEDURE [b: PupBuffer] = BEGIN b.dest _ myPupRouterSocket.remote; b.source _ myPupRouterSocket.local; PupRouterSendThis[b]; END; SetRemoteAddress: ENTRY SAFE PROCEDURE [a: PupAddress] = TRUSTED BEGIN myPupRouterSocket.remote _ a; END; GetLocalAddress: ENTRY SAFE PROCEDURE RETURNS [PupAddress] = TRUSTED BEGIN RETURN[myPupRouterSocket.local]; END; myPupRouterSocket.input _ NEW[BufferDefs.QueueObject]; END. ÄFile: PupSockets.mesa Last Edit: HGM March 14, 1981 11:50 AM Last Edit: Andrew Birrell June 22, 1983 5:25 pm Manager data We need to check local to verify that it is valid initialization ʘJšœ™Jšœ(™(Jšœ0™0J˜šÏk ˜ Jšœœ˜+Jšœœ˜"Jšœ œ ˜Jšœ œ ˜2šœœ˜J˜AJ˜—šœœ˜J˜IJ˜CJ˜—J˜ J˜ J˜—šœ œœ˜2Jšœ=˜DJšœ˜Jšœ ˜Jšœœ˜"J˜Jšœ ™ š œœœœœ˜HJ˜J˜—šÏn œœ œœœœœ˜JJš˜šœœ˜Jš˜Jšœœ ˜JšœÏc˜$Jšœ˜Jšœ˜—J˜ J˜Jšœ˜J˜—š ž œœ œœœœ˜CJšœœ˜'J˜J˜—Jš œœœœœ˜)J˜šœœ˜/šœŸ˜J˜7J˜$J˜——Jšœœœ˜ J˜J˜)J˜šž œœœ œ˜&J˜?Jšœ˜Jšœ˜ Jšœœœœ˜2J˜@J˜&J˜Jšœ œ˜J˜1šœ˜Jšœœ˜!J˜EJšœ<˜C—J˜8Jšœ˜Jšœ˜J˜—šžœœœ œ*˜RJšœ˜Jšœ˜ Jšœœœœ˜2Jšœ1™1J˜$J˜&J˜!Jšœ œ˜J˜1šœ˜Jšœœ˜!J˜EJšœ<˜C—J˜8Jšœ˜Jšœ˜J˜—š ž œœœœ œ˜;Jšœ˜ Jš œœœœœ#˜OJšœœ˜ Jšœ˜#Jšœ˜J˜—šžœœœ œ˜8Jšœ˜ Jš œœœœœ#˜OJ˜3J˜Jšœ˜J˜—š žœœœ œœ˜2Jšœ˜ šœ œ$˜8Jš˜Jš œœœœœ˜?Jšœ˜—Jšœœ˜ Jšœ$œœœ˜7J˜0šœœœ˜%J˜3—Jšœ˜J˜—šžœ œ˜Jš˜J˜"J˜#J˜Jšœ˜J˜—šžœœœ œ˜8Jšœœœ˜0J˜—š žœœœ œœ˜