<> <> <> DIRECTORY RunReader, LooksReader; LooksReaderImpl: CEDAR MONITOR IMPORTS RunReader, LooksReader EXPORTS LooksReader SHARES LooksReader = BEGIN OPEN LooksReader; Create: PUBLIC PROC [] RETURNS [new: Ref] = { <> new _ NEW[Body]; new^ _ [0,0,noLooks,RunReader.Create[]] }; lksrdr1, lksrdr2, lksrdr3: Ref; -- shared looks readers GetLooksReader: PUBLIC ENTRY PROC RETURNS [reader: Ref] = { IF lksrdr3 # NIL THEN { reader _ lksrdr3; lksrdr3 _ NIL } ELSE IF lksrdr2 # NIL THEN { reader _ lksrdr2; lksrdr2 _ NIL } ELSE IF lksrdr1 # NIL THEN { reader _ lksrdr1; lksrdr1 _ NIL } ELSE reader _ Create[] }; FreeLooksReader: PUBLIC ENTRY PROC [reader: Ref] = { SetPosition[reader, NIL]; IF lksrdr3 = reader OR lksrdr2 = reader OR lksrdr1 = reader THEN ERROR; IF lksrdr3 = NIL THEN lksrdr3 _ reader ELSE IF lksrdr2 = NIL THEN lksrdr2 _ reader ELSE IF lksrdr1 = NIL THEN lksrdr1 _ reader }; END.