DIRECTORY
FIFO,
FIFOGuardian,
Process,
RandomCard,
WF;
FIFODriver: MONITOR
IMPORTS FIFO, FIFOGuardian, Process, RandomCard, WF = {
p,q,r: PROCESS;
i: CARDINAL;
RandomYield: PROC = {
THROUGH [0..RandomCard.Choose[0,1]] DO
Process.Yield[]
ENDLOOP};
Reader: PROC = {
WF.WF0[" Reader started.*n"];
THROUGH [0..50) DO
RandomYield[];
UNTIL FIFO.DataAvQ[] DO RandomYield[] ENDLOOP;
FIFOGuardian.SetReadRequest[TRUE];
WF.WF1["%u ", FIFO.GetDataOut[]];
RandomYield[];
FIFOGuardian.SetReadRequest[FALSE];
ENDLOOP;
WF.WF0[" Reader terminated.*n"];
};
Writer: PROC = {
WF.WF0[" Writer started.*n"];
FOR i IN [0..50) DO
RandomYield[];
UNTIL FIFO.SpaceAvQ[] DO RandomYield[] ENDLOOP;
FIFOGuardian.SetDataIn[i];
FIFOGuardian.SetWriteRequest[TRUE];
WF.WF1["%u- ", i];
RandomYield[];
FIFOGuardian.SetWriteRequest[FALSE];
ENDLOOP;
WF.WF0[" Writer terminated.*n"];
};
[] ← RandomCard.InitRandom[-1];
START FIFO.FIFOImpl;
r ← FORK FIFO.Main[];
FIFO.SetInit[FALSE];
p ← FORK Reader[];
q ← FORK Writer[];
[] ← JOIN p;
[] ← JOIN q;
}.