-- 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], DriverTypes: 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 = CODE; QueueSealBroken: PUBLIC ERROR = CODE; GetFreeRppBuffer: 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 _ CommUtilDefs.GetReturnFrame[].accesslink; END; MaybeGetFreeRppBuffer: 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(2048)\494b8B270b16B41b2B295b21B43b2B199b21B69b1B