-- File: QueueLockedTiny.mesa, Last Edit: HGM October 15, 1979 8:04 PM -- Copyright Xerox Corporation 1979, 1980 DIRECTORY DriverDefs: FROM "DriverDefs" USING [freeQueueLock, freeQueue], PupDefs: FROM "PupDefs", -- EXPORTs BufferDefs: FROM "BufferDefs" USING [ Buffer, PupBuffer, RppBuffer, Queue]; QueueLockedTiny: MONITOR LOCKS DriverDefs.freeQueueLock IMPORTS DriverDefs EXPORTS DriverDefs, PupDefs, BufferDefs SHARES BufferDefs = BEGIN OPEN DriverDefs, BufferDefs; bufferSize: PUBLIC CARDINAL; EnqueuePup: PUBLIC PROCEDURE [Queue, PupBuffer] = LOOPHOLE[Enqueue]; EnqueueRpp: PUBLIC PROCEDURE [Queue, RppBuffer] = LOOPHOLE[Enqueue]; Enqueue: PUBLIC PROCEDURE [q: Queue, b: Buffer] = BEGIN b.next _ NIL; IF q.first=NIL THEN q.first_b ELSE q.last^.next_b; q.last _ b; b.queue _ q; q.length _ q.length+1; END; DequeuePup: PUBLIC PROCEDURE [Queue] RETURNS [PupBuffer] = LOOPHOLE[Dequeue]; DequeueRpp: PUBLIC PROCEDURE [Queue] RETURNS [RppBuffer] = LOOPHOLE[Dequeue]; Dequeue: PUBLIC PROCEDURE [q: Queue] RETURNS [b: Buffer] = BEGIN IF (b_q.first)=NIL THEN RETURN; IF (q.first_q.first.next)=NIL THEN q.last_NIL; q.length _ q.length-1; b.queue _ NIL; b.next _ NIL; END; -- This routine is only used by device drivers to get buffers to read things into. -- NB: b.length is setup for the size of the buffer, including ALL of the encapsulation. All device drivers must fudge things themsleves unless they use all of the encapsulation field. GetInputBuffer: PUBLIC ENTRY PROCEDURE RETURNS [b: Buffer] = BEGIN b _ Dequeue[@freeQueue]; IF b#NIL THEN b.length _ bufferSize; END; END. -- QueueLockedTiny(2048)\480b10B59b10B59b7B182b10B68b10B68b7B210i86bI4Bi56bI3Bi120bI14B