-- File: QueueRpp.mesa, Last Edit: HGM July 15, 1979 6:22 PM

-- Copyright Xerox Corporation 1979, 1980

DIRECTORY
CommUtilDefs: FROM "CommUtilDefs" USING [GetReturnFrame],
DriverDefs: FROM "DriverDefs" USING [
freeQueueLock, firstBuffer, freeQueue, freeQueueNotEmpty, MaybeGetFreeBuffer,
doDebug, doSee, Glitch],
PupDefs: FROM "PupDefs" USING [DequeueRpp, EnqueueRpp],
BufferDefs: FROM "BufferDefs" USING [
RppBuffer, Queue, GetFreeBuffer, buffersToReserve],
DriverTy
pes: FROM "DriverTypes" USING [queueSeal];

QueueRpp: MONITOR LOCKS DriverDefs.freeQueueLock
IMPORTS CommUtilDefs, DriverDefs, PupDefs, BufferDefs
EXPORTS DriverDefs, PupDefs
SHARES BufferDefs =
BEGIN OPEN DriverDefs, BufferDefs;

FreeQueueNotInitialized: PUBLIC ERROR = C
ODE;
QueueSealBr
oken: PUBLIC ERROR = CODE;

GetFreeRppBuf
fer: PUBLIC PROCEDURE RETURNS [b: RppBuffer] =
BEGIN
IF doDebug AND firstBuffer=NIL THEN Glitch[FreeQueueNotInitialized];
b ← LOOPHOLE[GetFreeBuffer[]];
IF doDebug OR doSee THEN b.type ← rpp;
b.rppPupType ← 4;
b.system ← b.sendAck ← b.notify ← FALSE;
IF doDebug THEN b.debug ← CommUt
ilDefs.GetReturnFrame[].accesslink;
END;

MaybeGetFreeRppBuffe
r: PUBLIC PROCEDURE RETURNS [ b: RppBuffer ] =
BEGIN
b ← LOOPHOLE[MaybeGetFreeBuffer[]];
IF b#NIL THEN
BEGIN
IF doDebug OR doSee THEN b.type ← rpp;
b.rppPupType ← 4;
b.system ← b.
sendAck ← b.notify ← FALSE;
END;
END;

GetClumpOfRppBuffers: PUBLIC ENTRY PROCEDURE
[
q: Queue, n: CARDINAL, wait: BOOLEAN] =
BEGIN ENABLE UNWIND => NULL;
b: RppBuffer;
IF doDebug AND firstBuffer=NIL THEN Glitch[FreeQueueNotInitialized];
IF doDebug AND q.seal#DriverTypes.queueSeal THEN Glitch[QueueSealBroken];
UNTIL freeQueue.length>n+buffersToReserve DO
IF ~wait THEN RETURN;
WAIT freeQueueNotEmpty;
ENDLOOP;
THROUGH [0..n) DO
b ← PupDefs.DequeueRpp[@freeQueue];
IF doDebug OR doSee THEN b.type ← pup;
b.rppPupType ← 4;
b.system ← b.sendAck ← b.notify ← FALSE;
IF doDebug THEN b.debug ← CommUtilDefs.GetReturnFrame[].accesslink;
PupDefs.EnqueueRpp[q,b];
ENDLOOP;
END;

END. -- QueueRpp