-- File: PupSockets.mesa - last edit:
-- AOF 17-Feb-88 16:00:33
-- Copyright (C) 1983, 1986, 1988 by Xerox Corporation. All rights reserved.
DIRECTORY
Buffer USING [Buffer, Dequeue],
CommFlags USING [doDebug],
Frame USING [GetReturnFrame, ReadGlobalLink],
Process USING [DisableTimeout, EnableAborts, SetTimeout],
PrincOpsMinus USING [NewSelf],
PupDefs USING [
Buffer, Dequeue, GetLocalPupAddress, Pair, PupAddress, PupBuffer,
PupRouterSendThis, PupSocket, PupSocketID, PupSocketObject, Tocks,
veryLongWait, veryShortWait],
PupRouterDefs USING [
PupRouterForgetAboutSocket, PupRouterKnowAboutSocket, PupRouterSocketObject,
routerLock],
PupTypes USING [Pair, PupAddress],
Runtime USING [GlobalFrame];
PupSockets: MONITOR LOCKS PupRouterDefs.routerLock
IMPORTS Frame, Process, PrincOpsMinus, Runtime, PupRouterDefs, PupDefs
EXPORTS PupRouterDefs, PupDefs =
BEGIN OPEN PupRouterDefs, PupDefs;
-- Manager data
free: LONG POINTER TO FRAME[PupSockets] ←
LOOPHOLE[Runtime.GlobalFrame[LOOPHOLE[PupSocketMake]]];
next: LONG POINTER TO FRAME[PupSockets] ← NIL;
GetInstance: ENTRY PROC RETURNS [him: LONG POINTER TO FRAME[PupSockets]] =
BEGIN
IF free = NIL THEN
BEGIN
him ← PrincOpsMinus.NewSelf[];
START him; -- Do initialization code
RETURN;
END;
him ← free;
free ← free.next;
END;
FreeInstance: ENTRY PROC[him: LONG POINTER TO FRAME[PupSockets]] =
{him.next ← free; free ← him};
myPupSocket: PupSocketObject ← [ -- data for the client
put: Put, get: Get, setRemoteAddress: SetRemoteAddress,
getLocalAddress: GetLocalAddress];
dontWait, kick: BOOLEAN ← FALSE;
myPupRouterSocket: PupRouterSocketObject;
PupSocketMake: PUBLIC PROC[
local: PupSocketID, remote: PupAddress, ticks: Tocks, id: Pair]
RETURNS [PupSocket] =
BEGIN
him: LONG POINTER TO FRAME[PupSockets] ← GetInstance[];
him.myPupRouterSocket.local ← GetLocalPupAddress[local, @remote];
him.myPupRouterSocket.remote ← remote;
him.myPupRouterSocket.id ← id;
him.dontWait ← him.kick ← FALSE;
PupRouterKnowAboutSocket[@him.myPupRouterSocket];
SELECT ticks FROM
veryShortWait => him.dontWait ← TRUE;
veryLongWait => Process.DisableTimeout[@him.myPupRouterSocket.ready];
ENDCASE => Process.SetTimeout[@him.myPupRouterSocket.ready, ticks];
Process.EnableAborts[@him.myPupRouterSocket.ready];
RETURN[@him.myPupSocket];
END;
PupSocketMakeFull: PUBLIC PROC[local, remote: PupAddress, ticks: Tocks]
RETURNS [PupSocket] =
BEGIN
him: LONG POINTER TO FRAME[PupSockets] ← GetInstance[];
-- We need to check local to verify that it is valid
him.myPupRouterSocket.local ← local;
him.myPupRouterSocket.remote ← remote;
him.myPupRouterSocket.id ← [0, 0];
him.dontWait ← him.kick ← FALSE;
PupRouterKnowAboutSocket[@him.myPupRouterSocket];
SELECT ticks FROM
veryShortWait => him.dontWait ← TRUE;
veryLongWait => Process.DisableTimeout[@him.myPupRouterSocket.ready];
ENDCASE => Process.SetTimeout[@him.myPupRouterSocket.ready, ticks];
Process.EnableAborts[@him.myPupRouterSocket.ready];
RETURN[@him.myPupSocket];
END;
PupSocketKick: PUBLIC ENTRY PROC[s: PupSocket] =
BEGIN
him: LONG POINTER TO FRAME[PupSockets] ←
LOOPHOLE[Runtime.GlobalFrame[LOOPHOLE[s.put]]];
him.kick ← TRUE;
NOTIFY him.myPupRouterSocket.ready;
END;
PupSocketDestroy: PUBLIC PROC[s: PupSocket] =
BEGIN
him: LONG POINTER TO FRAME[PupSockets] ←
LOOPHOLE[Runtime.GlobalFrame[LOOPHOLE[s.put]]];
PupRouterForgetAboutSocket[@him.myPupRouterSocket];
FreeInstance[him];
END;
Get: ENTRY PROC RETURNS [b: PupBuffer] =
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.Dequeue[@myPupRouterSocket.input];
IF CommFlags.doDebug AND b # NIL THEN
b.fo.debug ← Frame.ReadGlobalLink[Frame.GetReturnFrame[]];
END;
Put: PROC[b: PupBuffer] =
BEGIN
b.pup.dest ← myPupRouterSocket.remote;
b.pup.source ← myPupRouterSocket.local;
PupRouterSendThis[b];
END;
SetRemoteAddress: ENTRY PROC[a: PupAddress] =
BEGIN myPupRouterSocket.remote ← a; END;
GetLocalAddress: ENTRY PROC RETURNS [PupAddress] =
{RETURN[myPupRouterSocket.local]};
-- initialization
END.
LOG
20-May-83 10:15:11 By: SMA Action: Converted to new BufferMgr.
12-Jul-83 13:22:57 By: AOF Action: 32-bit procs.
17-Feb-88 15:16:08 By: AOF PrincOpsMinus for NEWing.