-- TestMonitoredQueue.Mesa -- written by Paxton. December 1981 -- last written by Paxton. 9-Dec-81 9:50:07 DIRECTORY MonitoredQueue; TestMonitoredQueue: PROGRAM IMPORTS MonitoredQueue = BEGIN OPEN MonitoredQueue; source: MQ ← Create[]; input: REF READONLY TEXT ← "abcdefghijklmnopqrstuvwxyz"; output: REF TEXT ← NEW[TEXT[26]]; Produce: PROC = { -- adds to source FOR i:NAT IN [0..input.length) DO Add[NEW[CHAR ← input[i]],source]; ENDLOOP; Close[source] }; Consume: PROC = { -- moves from source to output DO x: REF ANY ← Remove[source ! EndOfQueue => EXIT]; WITH x SELECT FROM xx: REF CHAR => { output[output.length] ← xx↑; output.length ← output.length+1 }; ENDCASE => ERROR; ENDLOOP }; Test: PROC = { p1: PROCESS ← FORK Produce; p2: PROCESS ← FORK Consume; ok: BOOLEAN; JOIN p1; JOIN p2; ok ← FALSE; Add[NIL, source ! QueueClosed => { ok ← TRUE; CONTINUE }]; IF ~ok THEN ERROR; IF input.length # output.length THEN ERROR; FOR i:NAT IN [0..input.length) DO IF input[i] # output[i] THEN ERROR; ENDLOOP; -- make sure can reuse the queue Reset[source]; output.length ← 0; p1 ← FORK Produce; p2 ← FORK Consume; JOIN p1; JOIN p2; ok ← FALSE; Add[NIL, source ! QueueClosed => { ok ← TRUE; CONTINUE }]; IF ~ok THEN ERROR; IF input.length # output.length THEN ERROR; FOR i:NAT IN [0..input.length) DO IF input[i] # output[i] THEN ERROR; ENDLOOP; }; Test; END.